An app store that adapts to you

Möbius grew an app store. Install an app by pasting a URL, tweak it by asking, run it offline, save it to your home screen. The store is the on-ramp; the bigger shift is the agent growing a cross-app personal system that adapts to you over time.

TL;DR. Möbius grew an app store, and the store is the on-ramp. The bigger idea is that the agent grows a cross-app personal system around you, rather than a heap of one-off apps. Apps share a storage layer and a permission model, so the agent can compose them and reshape the whole thing around you over time. You install by pasting a URL, tweak by asking, run offline, save to your home screen, and break things cheaply because the system is built around recovery.
  • The store is a curated starter pack rather than an open registry. A published app is a public repo with a mobius.json and an index.jsx entry point, and sharing one means sharing a URL.
  • The bigger idea is one connected system. Shared storage and a shared permission model let the agent compose your apps and grow them around you.
  • Updates are URL-keyed and three-way merged. Bump the version upstream, the store shows "Update available", and reinstalling merges the new code with any tweaks you made and keeps your data; on a real conflict the old version keeps running while the agent resolves it with you.
  • Recovery makes breaking cheap. Atomic installs that cannot half-land, a /recover route, and a git history of your whole instance.
  • Offline plus home screen. Apps install to your home screen as standalone PWAs and keep working with no network. Writes queue and sync when you reconnect.
  • The honest edges. The full cross-app compose flow and per-app rollback are not built yet, and I say so where it matters.

This is the third post about Möbius, a personalized AI agent you self-host. The first post is about the agent building the tools you ask for and editing the interface around them. The second is about the loop the developers use to make the agent better at building them. This one is about what those apps became once they stopped being one-offs and grew a place to live.

Across the series, Möbius is built around one goal, being genuinely useful to you. The app store gives that goal an on-ramp. Because your apps share a storage layer and a permission model, the agent can compose them and reshape the whole system around how you actually live.

The primitives that make this work are small on purpose. You can inspect the source. The smallest app is one source file and a small manifest the agent (or you) can rewrite in place; larger apps add only a few more files. An update is a new version of those files. Installing is a transaction the platform can roll back. Some of those pieces are solid; others are still plans.

The store starts as a starter pack

The app store is itself a Möbius app. On first boot the platform installs it through the exact same path you use for everything else, which keeps the install channel the same for the store and every other app.

News app icon
News runs daily
An AI-curated morning digest, written for you by a background job at 10:00.
Workout app icon
Workout on-device
A natural-language workout logger. Type "3×5 deadlift at 100kg" and it parses the sets, all on your device.
Atlas app icon
Atlas offline
A draggable 3D globe; tap the countries you have been to and watch the count climb toward 195.
Memory app icon
Memory memory
An Obsidian-style graph of what the agent has learned about how you work, the lessons worth keeping, made browsable.
LaTeX app icon
LaTeX AI
An Overleaf-style editor with a file drawer and a real tectonic engine, where an AI sub-agent writes .tex as you watch it typeset.
Reflection app icon
Reflection nightly
Overnight, Möbius reviews the day's work and leaves a one-page morning brief.
The curated catalog, the starter-pack apps the in-app store installs.

Today it is a hand-picked set. You can install from outside it:

App What it does
News A daily AI-curated digest. A background job wakes at 10:00, runs the agent with web search only, and writes the morning’s report.
Workout A natural-language workout logger. Type what you did, like “3×5 deadlift at 100kg”, and it parses the sets. No agent, no cloud, all on your device.
Atlas A draggable 3D globe; tap the countries you have been to and the count climbs toward 195.
Memory An Obsidian-style graph of what the agent has learned about how you work, the lessons worth keeping, made browsable.
LaTeX An Overleaf-style editor with a file drawer and a real tectonic engine; an AI sub-agent writes .tex while you watch it typeset.
Reflection Overnight, the agent reviews the day’s work and leaves a one-page morning brief, so it starts the next day a little sharper.

Each of those is a public git repo in the mobius-os organization, named app-<something>, with a mobius.json manifest, an index.jsx entry point, and a 1024×1024 icon. The smallest apps are that single file; larger ones pull in a few more, but the manifest plus an entry point is the whole contract. An app the agent builds just for your own instance needs none of this; the manifest only matters once you want to publish one. Publishing means making a repo public and sharing its manifest URL. The list above is a starter pack I picked. The install button takes any manifest URL you paste, and the store warns and lets you continue when it comes from a host it has not seen before.

index.jsx the app itself, one React component the agent wrote
mobius.json the manifest: name, version, what it may reach
icon.png a 1024×1024 icon
job.jsoptional a background job, if the app has one
What an app is, in full. One component, a manifest, an icon, an optional job. No build config, no server, no framework to learn; make the repo public and its URL is installable.

What “install” actually does

When you tap Install, the work happens on the server in one transaction. The platform fetches the manifest (because that URL can point anywhere, it refuses private networks and cloud metadata endpoints and re-checks every redirect), then the app’s source, icon, background job, and any starter data it ships. It compiles off to the side and goes live only after the database row commits, so only a complete app can open. If anything fails, the whole thing rolls back and leaves nothing behind.

That all-or-nothing property lets an update patch your app in place, and it lets recovery treat any break as something to undo.

Updates keep your data

An installed app remembers the URL it came from, and that URL is its identity. The name and version can change; the URL is what ties your copy to upstream. The store periodically checks each app’s upstream manifest, and when the version there is newer than yours it shows an “Update available” pill.

Tapping Update reinstalls from the same URL. The backend switches into update mode and patches the parts that should change (the code, description, permissions, icon, schedule), then recompiles and remounts. Your data stays out of that patch. Starter data only seeds missing keys, so an update can ship new defaults without trampling your logged workouts, your visited countries, your notes.

Upstream repo a new version is pushed to mobius.json
Update available the store sees a newer version than yours
Reinstall, same URL mode = update matched by URL, not name or version
Code patched, data kept new defaults seed only missing keys
An update is a reinstall from the same URL. The platform patches the source, description, permissions, icon, and schedule, and leaves the data you have created untouched.

I am glad I built this part. Each installed app is its own git repo, so an update runs as a three-way merge. It avoids the blunt overwrite path. If the upstream author ships a new version and you have asked the agent to customize your copy, the merge carries your edits forward. When the two genuinely collide, your old version keeps running while the agent opens a chat to work the conflict through with you, so a bad merge leaves your working app alone. The smarter merge is still ahead, the one that reconciles by intent instead of by lines of text. The plumbing it would run on is already here.

Recovery makes breaking cheap

Recovery works the way it does in the first post. The /recover page renders outside the shell so it loads even when the shell is broken, and your whole instance is a git repo the agent can walk back when you tell it what went wrong. The store adds one fallback of its own. Installs are atomic, so a failed or broken update lands fully or rolls back; the previous working version is restored from a snapshot, and a deleted app can be reinstalled from the same URL and come back with its data. A one-click “roll this app back to last week” button still needs building, so recovery today uses reinstall, /recover, and that git history.

Your home screen works with or without Möbius

An app you install also lives outside the chat. Each one is served at its own address, with its own web manifest and icon, as a standalone progressive web app. Add it to your phone’s home screen and it launches like any native app, full screen and without the drawer or chat. Workout opens straight to today’s session; Atlas opens to the globe.

Run standalone, an app vendors its own copy of React from your server because it runs without the Möbius shell that normally supplies shared libraries. Everything it needs comes from your server, which lets it render with the network off.

Offline work catches up

“Works offline” is easy to claim and hard to land on a phone. This part got the most unglamorous engineering, and it holds.

When an app is marked offline-capable, a service worker caches the shell and the app’s code, so opening it with the network off renders the real app. Storage works offline for every app, including ones without the offline-capable marker. Reads come instantly from a local cache and refresh in the background; writes you make offline queue in a local outbox and sync the moment you reconnect.

Offline app + storage served from a local cache; the real app renders with no network
You make changes writes land in a local outbox; reads reflect them immediately
reconnect
Synced the outbox drains to your server; last-write-wins per item
Log a set in airplane mode, mark a country from a plane, jot a note on the subway. The outbox catches up the moment you reconnect. Listing and chat deliberately stay online.

Your data survives a dead connection, and I have checked it on a real phone after the usual desktop-pretending-to-be-a-phone pass. Two operations stay online by design (a cached listing could resurrect things you deleted, and chat is online-only). Conflicts are last-write-wins per item, which is right for a single owner and needs more thought for a shared one.

One system made from small apps

Once your apps share a storage layer and a permission model, the agent can build across them. It can pull data from one app into another and build new tools on top of both.

Tweaking an app you have is real and easy. Open it, tell the agent what you want different (a darker palette, a new column, a weekly view instead of daily), and it edits the app’s source in place and recompiles. You skip the fork button and project setup; the app is one file, and the agent edits that file the same way it would write a new one.

Composing several apps into a new one is the next rung, and I still have to build the full flow. The idea is a health dashboard that reads across your workout tracker, calorie log, gratitude journal, and dream diary, then surfaces the metrics you actually care about. The backend already has the pieces. An app can declare that it reads another app’s data, and the backend enforces the handshake on both sides. But almost nothing uses it today, each app’s storage is scoped to itself by default, and the product still lacks a “build me an app that unifies these” flow. When I build it, this is the example I will build it against.

Gymworkouts, PRs
Caloriesintake
Gratitudedaily notes
Sleepsleep, streaks
not built yet Health dashboard reads across your apps and surfaces the metrics you care about
The composition I want and have not built yet. The dashed box marks the part that does not exist today.

The two apps I have barely touched here, Memory and Reflection, drive most of this adaptation. Memory records the lessons worth keeping from what the agent has learned about how you work. It avoids profile-building and focuses on what works. Reflection is the overnight job that reviews the day’s work and feeds new lessons back in. Together they are how the agent gets sharper at fitting your system to you over time. I cover them in your agent improves itself.

Building these apps well leans on the same two levers as the rest of Möbius, both from the harness post. One is the introspection loop that tightens the agent’s instructions. The other is a design phase where I drive with Claude and pressure-test with Codex before a line of the app is written, since the build is cheap and the leverage is in the design.

Philosophy under all of it

Code empowers the agent; policing is a last resort. When the agent needs to install an app, write to your shell, or schedule a job, the platform’s job is to make that possible and reversible, with second-guessing reserved for failures that would be silent and catastrophic. Validators show up only in those cases; everywhere else the lever is a clear contract and a good recovery path.

Low floor, high ceiling. A personal tracker that stores a little data and works offline should take one sentence, and an app that wants its own local database is free to reach for one. The one real wall right now blocks arbitrary network connections from apps to outside services, a deliberate security line I have not yet built a careful door through.

You own all of it. Your data is on a server you control. Your apps are files you can read. Your shell is a git repo you can revert. The system is tuned for usefulness. Engagement hacking is the wrong goal here. Across this series, I have been arguing for an assistant that builds the thing you asked for and then leaves you with software you actually own.

After the starter pack

An app store was the obvious next thing once the agent could build apps reliably. With a store, Möbius becomes a system where the unit of software is small enough for the agent to write and repair, installing and breaking are reversible, and “I wish I had a thing that…” becomes a thing you can open on your phone.

The apps above are a starter pack; the interesting ones are still ahead. If you deploy an instance and build something, or tear one of these apart and rebuild it as something better, that is the use case I care about, and I would love to see it.

The source is on GitHub, the app repos are under mobius-os, and the deploy button gets you a working instance in about three minutes.