#1924: Build Your Own App Store for Linux and Android

Stop manually copying files. Learn how to host your own authenticated repositories for .deb and APK files using simple static web servers.

0:000:00
Episode Details
Episode ID
MWP-2080
Published
Duration
20:33
Audio
Direct link
Pipeline
V5
TTS Engine
chatterbox-regular
Script Writing Agent
Gemini 3 Flash

AI-Generated Content: This podcast is created using AI personas. Please verify any important information independently.

The "It Works on My Machine" Problem, Personalized

For developers who automate their lives with custom tools, a new friction point has emerged. When you build a utility perfectly suited for your desktop, moving to your laptop often means reverting to manual file transfers and command-line installs. This episode explores how to solve this by building a personal distribution pipeline for both Linux and Android, turning bespoke scripts into a seamlessly updated software ecosystem.

The core of the solution is surprisingly simple: treating your software repository as a static file server. On Linux, tools like Reprepro or Aptly take your .deb files and generate the standard Debian repository structure—a folder of files that includes Packages and Release metadata signed with a GPG key. When your laptop runs apt update, it downloads these text files, verifies the signature against a trusted key, and checks for newer versions. The entire backend is just a web server like Nginx or Caddy hosting a folder of files.

For private repositories, the setup remains lightweight but secure. You can use HTTP Basic Auth on your web server to protect sensitive packages. The apt client can handle this by storing credentials in /etc/apt/auth.conf.d/, keeping them separate from your main source lists. This allows you to maintain both public and private repos on the same server without exposing internal tools.

The workflow becomes truly powerful when automated. Using GitHub Actions, you can trigger a pipeline on every code push that builds the .deb package, signs it, and uses a tool like rclone or scp to upload it to your server. A small script on the server can then update the repository index automatically. This creates a private CI/CD pipeline that delivers updates to your devices within seconds, mirroring the efficiency of large tech companies without the overhead.

The same principles apply to Android with F-Droid. The fdroidserver tool scans a folder of APKs, generates an index, and signs it. Hosting this folder on a web server allows you to add a custom repository to the F-Droid client on your phone. The client handles updates just like the Play Store, and authentication can be baked into the repository URL. This solves the manual update fatigue for personal Android apps.

The timing for this approach is ideal. With AI accelerating code generation, the bottleneck has shifted from writing tools to deploying them. A manual install that was acceptable for a script written over three weeks becomes a major friction point when a similar tool is generated in ten minutes. Personal deployment pipelines are becoming a necessity.

The initial setup involves generating GPG keys and configuring the web server, but once in place, maintenance is minimal. Tools like Aptly even offer snapshot capabilities, allowing you to roll back to a previous repository state if a bug slips through. This transforms fragile personal scripts into robust, versioned software. The infrastructure scales effortlessly, whether you're syncing two personal devices or providing a professional repository for an open-source project.

Downloads

Episode Audio

Download the full episode as an MP3 file

Download MP3
Transcript (TXT)

Plain text transcript file

Transcript (PDF)

Formatted PDF with styling

#1924: Build Your Own App Store for Linux and Android

Corn
You ever get that feeling where you’ve built something perfectly suited for your own life, but then you move five feet to the left to a different device and suddenly you’re back in the stone ages? Today’s prompt from Daniel hits on exactly that. He’s been cranking out so many custom tools thanks to AI that he’s hitting a classic developer wall. He’s got these great .deb packages for Ubuntu and APKs for Android, but every time he switches from his desktop to his laptop, he’s stuck in this loop of manual updates. It’s the "it works on my machine" problem, but the machine is his other machine.
Herman
It is the ultimate first-world developer problem, isn’t it? Herman Poppleberry here, and I have to say, Daniel’s situation is becoming incredibly common. When you’re an indie dev or just someone who automates their life heavily, you start creating this bespoke software ecosystem. But a tool is only as good as its availability. If you have to manually scp a file and run a dpkg command every time you fix a bug, you’ve just traded one manual task for another. By the way, today’s episode is powered by Google Gemini 3 Flash, which is fitting because we are talking about the high-speed evolution of developer workflows.
Corn
I love that we’re at the point where we’re talking about "personal distribution pipelines." It sounds so corporate and heavy, but it’s actually about freedom. Daniel wants to know if he can run his own authenticated PPA and manage public versus private repositories without losing his mind. And honestly, Herman, I suspect you’ve got a spreadsheet somewhere of exactly how to do this because this smells like a deep-dive topic you’ve been obsidian-noting for months.
Herman
You know me too well. The short answer is yes, and it’s actually more mature than people realize. We aren’t just talking about hosted services like Launchpad or the Play Store. We’re talking about taking the tools the big boys use—Aptly, Reprepro, and F-Droid server—and scaling them down to fit on a cheap VPS or even a home server. The beauty of the Linux and Android ecosystems is that the "plumbing" for software updates is actually quite modular. If you can host a static file and sign it with a GPG key, you can be your own Canonical. You can be your own Google.
Corn
Being my own Google sounds like a lot of responsibility. I can barely manage my own lunch. But seriously, let's start with the Linux side. Daniel’s mentioned .deb files. Usually, when we think of a PPA, we think of that "add-apt-repository" command where we trust some random dev on the internet. How does a single person set that up for themselves so their laptop just "sees" the updates?
Herman
The magic word here is Reprepro, or if you want to get fancy, Aptly. Let’s start with Reprepro because it describes exactly what’s happening under the hood. It’s a tool that takes your .deb files and builds a folder structure that follows the Debian repository standard. It creates the "Packages" file, the "Release" file, and most importantly, it signs them. When you run "apt update" on your laptop, the system isn't doing anything magical. It’s just downloading a text file from a server, checking if the signature matches a key you’ve trusted, and seeing if the version number is higher than what’s installed.
Corn
So it’s essentially just a very organized web server? If I put a folder on a website and point apt at it, am I halfway there?
Herman
Precisely—well, I shouldn’t say precisely, but you’re on the right track. It’s a static site. That’s the genius of it. You don’t need a complex database or a heavy backend. You just need a place to host files. The "hard" part, if you can call it that, is the GPG signing. Your laptop needs to know that the package coming from Daniel's server actually came from Daniel. So you generate a GPG key, use Reprepro to sign the repository metadata, and then you add that public key to your laptop’s trusted keys. Once that’s done, your laptop treats Daniel’s personal server with the same institutional respect it gives to the official Ubuntu mirrors.
Corn
I like the idea of my laptop showing "institutional respect" to a folder sitting on a Raspberry Pi in a closet. But Daniel had a specific twist: he wants to maintain a public repo for his open-source stuff and a private, authenticated one for the secret sauce or personal configurations. How do you handle that "private" part without making the files world-readable?
Herman
This is where we move from the repository tool to the web server configuration. You can use something like Nginx or Caddy to host the files. For the public stuff, you just let it be. For the private stuff, you put it behind HTTP Basic Auth. Now, you might think, "Wait, can apt handle a username and password?" And the answer is yes. You don't put the credentials in the sources.list file where they might leak. Instead, you use a file on your laptop located at /etc/apt/auth.conf.d/. You put your credentials in there, and when apt tries to hit that specific URL, it automatically injects the login info. It’s seamless. Once it’s set up, you never think about it again.
Corn
That sounds like a dream for someone like Daniel who is constantly hopping between devices. But let’s talk about the friction. Setting up Reprepro sounds fine for a one-off, but Daniel’s a tech comms and automation guy. He’s going to want this to be a pipeline. If he pushes code to GitHub, he doesn’t want to then have to manually run Reprepro on a server. What’s the "pro" version of this workflow?
Herman
The pro version—the "Daniel version"—is using GitHub Actions as the engine. Imagine this: Daniel writes his code, pushes to a private repo. A GitHub Action triggers, builds the .deb package using a tool like dpkg-deb or fpm, and then—here’s the clever bit—it uses rclone or ssh to push that .deb to his personal server. On that server, a small script or a file-watch trigger sees the new file and tells Reprepro to "include" it in the repository. Within seconds, his laptop gets a notification that an update is available. He’s essentially built his own private CI/CD pipeline that ends on his hardware.
Corn
It’s basically a DIY version of what the big tech companies do, but without the three-hour meetings and the Jira tickets. I’m curious about the Android side of things, though. Android is notoriously more "locked down" than Linux when it comes to installing things outside the Play Store. Daniel mentioned APKs and F-Droid. Is it the same deal? Just a signed folder on a server?
Herman
It’s remarkably similar, but the tool of choice is fdroidserver. F-Droid isn't just an app store; it’s a standard. The fdroidserver tool lets you point a command at a folder full of APKs, and it generates an index.xml or an entry.json file. It also handles the signing. You then host that folder on any web server. On your phone, you open the F-Droid client, add your custom URL, and boom—you have your own personal app store.
Corn
Does the F-Droid client handle authentication? Because if I’m building a custom app that, I don't know, unlocks my front door or manages my personal finances, I definitely don't want that APK floating around where anyone can download and reverse-engineer it.
Herman
It does! You can actually bake the credentials right into the repository URL in the F-Droid app, or use the same basic auth logic we discussed for Linux. What’s really cool about the F-Droid ecosystem is that it supports "internal" updates. If Daniel builds a new version of his app, the F-Droid client on his phone will see the version bump in the index file and prompt him to update, just like the Play Store would. It solves that "manual update" fatigue entirely.
Corn
I’m starting to see why this is a growing trend for indie devs. The barrier to entry for "being a distributor" has dropped through the floor. But let's look at the complexity. If I’m Daniel, and I have five tools on Ubuntu and three apps on Android, am I spending more time maintaining the "distribution pipe" than I am actually writing the tools? Is there a point where this becomes "over-engineering for one"?
Herman
That’s the classic developer trap, isn’t it? "I spent six hours automating a six-minute task." But in this case, the "maintenance" is almost zero once the initial plumbing is in place. If you use a tool like Aptly instead of Reprepro, you get even more power. Aptly lets you take snapshots. So if Daniel pushes a buggy version of his tool to his laptop and it breaks his workflow, he can "roll back" the entire repository to a previous snapshot with one command. That kind of safety is hard to get with manual file transfers.
Corn
I like that "safety" angle. It turns your personal tools from "fragile scripts I’m afraid to touch" into "actual software." But let’s talk about the "why" here. Why is this happening now? Daniel mentioned AI maturity. I’m guessing he’s saying that because AI is making it so much faster to write these tools, the bottleneck has shifted from "how do I code this?" to "how do I deploy this?"
Herman
Spot on. When it took you three weeks to write a utility script, you didn't mind a five-minute manual install. But now, if you can describe a problem to a model and get a working .deb package in ten minutes, the manual deployment becomes fifty percent of the total time spent. That’s a massive friction point. We’re seeing a shift where "Deployment as Code" is becoming a personal necessity, not just an enterprise one.
Corn
It’s like we’re all becoming mini-IT departments for our own lives. I mean, Daniel’s originally from Ireland, now in Jerusalem, working in tech comms—he’s clearly a guy who moves around, both physically and digitally. Having a "cloud-native" approach to his own local tools makes sense. But what about the hardware? Do you need a beefy server to run these repository managers?
Herman
Not at all. These tools are incredibly lightweight. Reprepro and fdroidserver are just generating static metadata. You could run the build process on your main desktop, sync the resulting folder to a five-dollar-a-month VPS, or even a static host like GitHub Pages for the public stuff. The actual "hosting" is just serving files. The "computing" happens when you generate the index, which takes seconds. The real investment is in the initial setup of the GPG keys and the web server config.
Corn
Let’s talk about those GPG keys for a second, because that’s usually where people start screaming and pulling their hair out. If Daniel wants his laptop to trust his desktop, he’s got to manage those keys. Is there a "GPG for Dummies" version of this, or do we just have to embrace the pain of the command line?
Herman
There’s no avoiding the command line entirely, but the workflow is simpler than it used to be. You generate a key pair. You keep the private key on your "build machine"—the one running Reprepro. You export the public key, move it to the laptop, and run "apt-key add" or the more modern equivalent of dropping it into /etc/apt/trusted.gpg.d/. The biggest hurdle is just making sure you don't lose that private key. If you lose it, you can’t update your repo anymore, and you have to go around to all your "client" devices and tell them to trust a new key.
Corn
Which, for Daniel, is just two machines, but if he starts sharing these tools with friends or family—or if his son Ezra grows up and wants to use Dad’s custom apps—suddenly you’re managing an "org." It’s a slippery slope from "I want to sync my laptop" to "I am the sysadmin for my extended family."
Herman
And that’s actually a great point. These tools scale. If Daniel’s open-source tools on GitHub start getting traction, he’s already got the infrastructure to provide a professional-grade repository for his users. Instead of telling people to "download this random deb and hope for the best," he can say, "Add my PPA." It builds instant credibility. It shows you care about the lifecycle of the software, not just the initial release.
Corn
It’s the difference between a pop-up shop and a brick-and-mortar store. One feels temporary, the other feels like it has a foundation. I want to go back to the "private APK" thing though. Android has been getting more aggressive with its "Play Protect" warnings. If Daniel installs his own app from his own F-Droid repo, is his phone going to scream at him every five minutes that he’s installing malware?
Herman
It’ll give him the initial "Unknown Sources" warning, but once he’s toggled that for the F-Droid app, it’s actually quite smooth. The real trick is to sign the APKs with a consistent developer key. If the key matches, Android treats it as a legitimate update to the existing app. If he changes the key, he has to uninstall and reinstall. So, just like with the GPG keys for Linux, the "secret sauce" is just good old-fashioned key management.
Corn
It always comes back to keys. It’s like the digital version of losing your car keys, except if you lose these, you lose access to your own labor. You mentioned a tool called "Aptly" earlier and called it the "Swiss Army knife." What does it do that Reprepro doesn't? Why would Daniel pick one over the other?
Herman
Reprepro is great if you have a very static workflow. "I have a file, put it in the repo, done." Aptly is for when you want to get sophisticated. It treats repositories like a version-controlled system. You can have a "staging" repo where you test things, and then "publish" that staging repo to your "production" endpoint. It also handles mirroring effortlessly. If Daniel wanted to mirror a specific subset of the official Ubuntu repos alongside his own tools—maybe to ensure he always has a specific version of a dependency—Aptly can do that. It’s more for the "power user" who wants total control over the environment.
Corn
I feel like Daniel is definitely in the "total control" camp. If you’re building your own tools with AI, you’re already someone who isn't satisfied with the "off-the-shelf" world. You’re building a bespoke digital life.
Herman
And there’s a philosophical point here too. By self-hosting his distribution, Daniel is opting out of the "centralized store" model. He’s not beholden to Google’s whims on the Play Store or Canonical’s decisions for the main Ubuntu repos. If he wants to keep an old version of a tool alive because it works perfectly for his workflow, he can. He is the curator.
Corn
The Curator of the Daniel-verse. I like it. But let's talk about the "merge debt" and "configuration drift" mentioned in the background notes. If he’s maintaining a public repo on GitHub and a private repo on his own server, how does he keep them from diverging into a mess?
Herman
That’s where the "Unified Distribution Pipeline" comes in. He should use the same build scripts for both. The only difference should be the "destination" tag in his CI/CD. Public builds go to GitHub Pages; private builds go to his authenticated VPS. If he treats them as two branches of the same process, he avoids that drift. The goal is to make the "public" versus "private" distinction a matter of routing, not a matter of manual effort.
Corn
It’s like having two different mailboxes for the same house. One’s for the public, one’s for the family, but the mail carrier—the GitHub Action—doesn’t care. It just drops the package where it’s told.
Herman
That’s a great way to put it. And for someone like Daniel, who is technically literate and already using tools like GitHub and NPM, this is just the final mile of his automation journey. He’s already automated the "creation" phase with AI; now he’s automating the "consumption" phase.
Corn
It’s funny, we spent years talking about "The Cloud" as this big, scary thing owned by Amazon and Google. But now, "The Cloud" is just a set of protocols that we can run ourselves. I can have a "Daniel Cloud" or a "Corn Cloud." It’s a very pro-sovereignty way of looking at tech, which I know we both appreciate.
Herman
It really is. It’s about taking those enterprise-grade tools—the stuff that makes the world run—and realizing they aren't magic. They’re just well-documented standards. If you can read a man page and configure a web server, you can have the same level of infrastructure as a mid-sized software house.
Corn
Alright, I’m sold. I’m going to go home and set up a repository for my collection of sloth-themed terminal themes. But before we wrap this up, let’s give Daniel some concrete "First Steps." If he’s sitting at his desk right now, what’s the first thing he should install to get this moving?
Herman
Step one: Install Reprepro on his server. It’s the easiest point of entry. Get a basic repo working with one .deb file. Step two: Set up an Nginx site to serve that folder. Step three: Add the URL to his laptop and see that beautiful "1 package can be upgraded" message. Once he feels that dopamine hit of an automated update, he’ll be motivated to set up the GitHub Actions and the F-Droid server.
Corn
That "1 package can be upgraded" message is the developer version of a "thinking of you" text. It’s just your computer letting you know it’s ready for the latest and greatest.
Herman
And for the Android side, he should look at the "fdroidserver" package. It’s a bit more involved to set up than Reprepro, but the documentation is excellent. He can even use a simple Python script to watch a folder and run the "fdroid update" command whenever a new APK appears.
Corn
It sounds like he’s got a fun weekend project ahead of him. Or knowing Daniel, he’ll have it done by the time this episode finishes playing.
Herman
Probably. When you’ve got AI helping you with the config files, the "weekend project" becomes the "lunch break project."
Corn
Well, I think we’ve covered the "how" and the "why." It’s all about closing that loop from creation to installation. No more manual scp-ing like it’s 1999.
Herman
Amen to that. The future is pull-based, not push-based. Let your devices do the work of staying up to date.
Corn
Before we sign off, I want to make sure we hit the practical takeaways. Number one: Reprepro for simple Linux repos, Aptly if you want snapshots and complexity. Number two: F-Droid server for your Android apps. Number three: HTTP Basic Auth for privacy, and don't forget the auth.conf.d file on the client side. And number four: Use GitHub Actions to tie it all together so you never have to manually run a build command again.
Herman
Perfect summary. It’s all about reducing the friction between "I have an idea" and "I am using that idea on all my devices."
Corn
That’s the dream. Well, this has been a great deep dive. I actually feel like I understand GPG keys about five percent more than I did twenty minutes ago, which is a record for me.
Herman
I’ll take that as a win! It’s a complex world, but the tools are finally catching up to the needs of the individual developer.
Corn
Huge thanks to our producer Hilbert Flumingtop for keeping the gears turning behind the scenes. And a big thanks to Modal for providing the GPU credits that power this show—it’s tools like theirs that make this kind of high-level discussion possible.
Herman
If you found this useful, or if you’ve built your own personal distribution pipeline and have some tips we missed, reach out to us. We love hearing how people are actually implementng this stuff in the wild.
Corn
This has been My Weird Prompts. If you’re enjoying the show, a quick review on your podcast app helps us reach more curious minds like Daniel’s.
Herman
Find us at myweirdprompts dot com for the full archive and all the ways to subscribe. Until next time.
Corn
Stay curious, and keep those repos signed. Goodbye!
Herman
Goodbye!

This episode was generated with AI assistance. Hosts Herman and Corn are AI personalities.