[AI in Practice] Before You Install a Stranger's Code, Let AI Read the Source First

A 60-star file-transfer tool with no license. I had AI read all 280KB of its source in about five minutes, got four things to switch off or avoid, then checked three of its claims myself. Includes the questions you can ask AI before installing any small tool.
Contents

See what a man does. Mark his motives. Examine what he rests in. How can a man conceal his character?
—— The Analects, Book II (Confucius, c. 5th century BC; translation mine)
Confucius said that if you watch what a person does, how they do it, and where they settle afterward, they cannot hide from you. This week I used the same idea on a piece of software.
A few days ago I needed to move a small file from my computer to my phone, and realized there was no easy path between the devices at home. Then I found a small tool on GitHub called owldrop (github.com/Rastavich/owldrop). It wraps Tailscale’s built-in file sending in a window with an inbox: save incoming files with one click, send to any device with another.
I wanted it. A few things made me pause: 60 stars, an author I didn’t know, no license in the repo, and a job description that amounts to handling every file I receive.
In the past I had two choices in this situation: trust it or skip it. This time I tried a third one. I asked AI to read the source code first.
The four questions I asked
“Is this safe?” is too broad. AI tends to answer it with something reassuring, and you have no way to check the answer. So I asked four specific questions, and required a file name and line number for every answer:
- Which external addresses does it connect to? What does it send? Is that on by default?
- Which ports does it open? Who can connect from outside?
- Does it update itself? When it downloads a new version, does it verify the author actually published it?
- What happens to files I receive? Could they land in an unexpected folder, or be run directly?
The code is 41 Go files, about 280KB. I couldn’t read that in an afternoon. The AI finished in a little over five minutes.
The prompt I actually used
The four questions above are the short version. Here is what I pasted in that day, with my local paths and one question about build steps removed. Copy it and swap in the project you want to check:
Please review the source code of this open-source project: (paste the GitHub URL). I want to know whether I can safely install it on my own computer. Read only. Do not run anything from the project and do not install packages. Give a conclusion for each item, with file names and line numbers.
- List every external address the program connects to. For each one: on or off by default? What data is sent? Can it be turned off?
- Does it send usage data? What is sent, where, is it on by default, and how do I turn it off?
- Does it update itself? Where does it download from? Does it verify a signature or checksum on the download? Does it install on its own?
- Which address and port does it listen on by default? Are any sharing modes on by default? How does it confirm who is connecting?
- Where are received files saved? Can someone use ../ to push a file into another folder? Can a received file be executed directly?
- Are there binaries I can’t read, long encoded strings, or places that run external commands?
- Are any of its dependencies unusual?
- If I install it, which features should stay off?
Finish with a one-line verdict: safe to install, safe after turning some features off, or not recommended, and why.
Question six turned up a surprise. The repo carries two old Linux binaries, 21.6MB and 14.8MB, left over from before the project was renamed. Nothing uses them, and they don’t affect the Windows build. But if I hadn’t asked, I wouldn’t have known there were two files in there whose contents I had no way to inspect. Question eight was the most useful: it told me exactly which switches to turn off after installing.
What it gets right
Some fairness first. By default the program only listens on the local machine (127.0.0.1), so other devices on the network can’t reach it. Any request that changes something needs a randomly generated token. Incoming file names are stripped of their path, so nobody can use ../ to drop a file into another folder. For a small project, the author clearly put thought into this.
Four things I switched off or avoid
First, it sends usage data to the author by default: app version, operating system, event names (such as “saved a file”), timestamps, and a random install ID. No file names. The README has a whole section on this and explains how to opt out. I opted out.
Second, when “LAN mode” is on, the program listens on every network. The README says LAN mode “exposes it to your tailnet only,” but in the code that mode binds to 0.0.0.0, meaning every network interface, and accepts any IP address in the Host header. Take a laptop to a café and join the public Wi-Fi, and someone on that network could reach it. The documentation and the code disagree here, so I don’t use this mode.
Third, in the auto-update path the AI couldn’t find any step that verifies a download came from the author. The update manifest and the executable live under the same GitHub account; if that account were compromised, both could be swapped together.
Fourth, pressing “Open” on a received .exe runs it. The interface shows a warning first, with a list of more than forty file extensions, so the author did think about it. My own rule: never press Open on an executable inside it.
How I checked what the AI told me
AI reads code fast, and it can also be wrong. So I took the three most important claims from its report and opened the source myself.
For telemetry being on by default, I opened main.go: the default config says Telemetry: true. For auto-update, the default version string is dev, and the updater only runs when the version looks like “number.number.number”. For listening only on the local machine, the code says 127.0.0.1.
All three held up. Each took me under a minute, because the AI had given me the file and line, and I didn’t have to search 280KB myself.
It also said “I don’t know” once. Whether the external updater library compares file fingerprints under the hood can’t be confirmed, because that code isn’t in this project. I liked that answer. It kept “couldn’t find it” separate from “it isn’t there.”
How I installed it
I compiled it from source. That ties back to the third point: I had read the source, but I couldn’t look inside the author’s prebuilt installer, so I had no way to confirm the two were the same thing. Building it myself means I only trust the copy I’ve read.
I left the version string empty on purpose, so the auto-updater never starts. To upgrade later, I’ll read the source again and rebuild. Before the first launch I wrote the config file with telemetry off, so not even the first ping goes out.
After installing I checked once: it opened one port, on the local machine only, and made zero outbound connections. Both of my computers run the same file, and the fingerprints on the two copies match exactly.
Where this stops working
A read by AI doesn’t make a program safe. It can miss things, and it read this project’s code, not every library the project pulls in. What it gave me was a map: where to look, and which switches to flip.
It’s also not worth it for large software. Browsers and operating systems run to millions of lines, and there you rely on the vendor’s reputation and a whole industry checking their work. This works best for tools like owldrop: small, new, few stars, an author you don’t know, and access to your files or your network.
You don’t need to be a programmer. The questions don’t require reading code, only pasting a link into an AI. If you don’t understand the answer, ask it to explain again in words a ten-year-old would follow.
One thing to take with you
What I took from this: when AI tells me something, it should come with a source, and I only really know the parts I can check.
Next time you’re about to install a small tool you don’t know, you could try what I did. Paste its link into an AI and ask one question: “Which external addresses does it connect to? Is each one on by default? Give the file name and line number for each.” Copy the addresses it lists onto a sticky note, pick one, open the source and check it yourself, and write “right” or “wrong” next to it. Pasting the link counts as done; checking an answer is a bonus. The same question works on your phone: next time an app asks for a permission, ask what it wants that permission for.