Personal Apps, finally.

The internetYour files
resworbnoyes
A browseryesno

Every tool you wish you had is one prompt away. One file. Double-click. It’s an app.

It works on your files, and it can’t send them anywhere you didn’t allow.

Free, open source, nothing to sell you. macOS and Linux.

Personal Apps

“Here’s my data. Build me a dashboard.” One file. Double-click. It’s an app.

  1. One prompt

    Tell your AI what you need. It writes the whole app as a single HTML file.

  2. One file

    Keep it, copy it, send it to a friend. Use it for a minute or for years. Done with it? Delete it.

  3. Your real files

    It opens, edits and saves the files on your computer. No uploading, no downloading.

  4. Nothing locked in

    Everything it saves is a plain file that opens in any other app.

01 · A chore400 photos from the weekend. You’ll keep 60. No prompt can pick your best shot. Only your eyes can.

02 · One promptSo ask your AI for a culler. You get one file, cull.lmth. One line at the top says what it needs: to move photos in this folder.

03 · You decideDrop it in the folder and double-click it. Before anything runs, resworb tells you in plain words what the app wants.

04 · Your eyesClick Allow. One key per photo: → keeps, ← moves it to rejects, Z takes it back.

05 · YoursKept 60 of 400. Nothing deleted: the rest wait in rejects. See the code for yourself.

~/Pictures/Weekend 400 photos
  • IMG_0412.jpg
  • IMG_0413.jpg
  • IMG_0414.jpg
  • IMG_0415.jpg
  • IMG_0416.jpg
  • IMG_0417.jpg
  • IMG_0418.jpg
  • IMG_0419.jpg
  • IMG_0420.jpg
  • IMG_0421.jpg
  • IMG_0422.jpg
  • IMG_0423.jpg
  • IMG_0424.jpg
  • IMG_0425.jpg
  • IMG_0426.jpg
  • IMG_0427.jpg
  • IMG_0428.jpg
  • IMG_0429.jpg
~/Pictures/Weekend/cull.lmth
<!doctype html><meta charset="utf-8"><meta name="resworb-write" content="."><title>Cull</title><style>  html, body { height: 100%; margin: 0; background: #111; color: #eee; font: 14px system-ui, sans-serif; }  img { display: block; width: 100%; height: 100%; object-fit: contain; }  p { position: fixed; left: 1rem; bottom: 1rem; margin: 0; }</style><img id="photo" alt=""><p id="progress"></p><script type="module">  // → keeps the photo, ← moves it to ./rejects, Z takes back the last choice.  const photos = (await resworb.readdir('.')).filter(name => /\.(jpe?g|png|gif|webp)$/i.test(name)).sort();  const choices = [];  await resworb.mkdir('rejects');  …
Cull

1 / 400, kept 0 · IMG_0412.jpg2 / 400, kept 0 · IMG_0413.jpg3 / 400, kept 1 · IMG_0414.jpg4 / 400, kept 1 · IMG_0415.jpg5 / 400, kept 1 · IMG_0416.jpg6 / 400, kept 2 · IMG_0417.jpg7 / 400, kept 2 · IMG_0418.jpg8 / 400, kept 2 · IMG_0419.jpg9 / 400, kept 3 · IMG_0420.jpg

~/Pictures/Weekend Kept 60 of 400
  • rejects340 photos
  • IMG_0413.jpg
  • IMG_0416.jpg
  • IMG_0419.jpg
  • and 57 more
  • cull.lmth

Start

Your first app in three steps.

  1. Install resworb

    Once. Download it for macOS or Linux.

  2. Ask your AI

    Any coding agent that can write files, such as Claude Code or Codex. Point it at the resworb skill, which teaches it how to write an app for resworb, and say what you need:

    Read https://github.com/Orcaryn/resworb/blob/main/skills/resworb/SKILL.md and write me a resworb app that shows my ~/Notes folder as cards.
  3. Double-click

    Open the .lmth file it wrote. Read the popup, click Allow. That’s it.

Need ideas? Four apps, each one file.

01 · Safe by defaultYour AI wrote the app. resworb keeps it in line.

02 · Your foldersOut of the box, it sees only its own folder. Anything more needs your yes.

03 · No internetYour operating system cuts it off from the internet. So it can’t send your files anywhere.

04 · Checked every timeBefore the window even opens, resworb checks that the app is offline. If it can’t be sure, it refuses to open it.

05 · Secrets stay secretYour keys and logins stay hidden, unless the app names them and you say yes.

06 · One server, if you allow itNeed data from the web? An app can ask for one server. It reaches that one and nothing else, and every request is logged. What the fence does not cover

This computer~/.ssh~/Documents~/Music~/Desktop~/Pictures/Weekendrejectssee and changecull.lmthInternetblocked by the OSchecked: offlinekeys and logins, hiddenapi.example.com:443allowed, every request logged

Under the hood

Two processes, one of them offline.

  1. The first process

    Has the network. Reads the page’s <meta> tags before any script runs, shows the popup, and runs the proxy for resworb-net.

  2. The sandbox

    It relaunches itself in the OS sandbox: Seatbelt on macOS, bwrap --unshare-net on Linux. The kernel denies sockets and DNS to it and to every process it starts.

  3. The offline check

    Before it opens the window, the sandboxed process proves it is offline: on macOS it must fail to bind a loopback port, on Linux its network must hold only lo. If it cannot, it refuses. No flag skips this.

  4. The page

    A page reaches files only through window.resworb, which checks every path against its grants. The sandbox also limits writes to the granted folders, for the page and every program it runs.

The tags

One value per <meta>. With no tags, a page may see its own folder and nothing else, and it opens without asking.

TagAllowsFor example
resworb-readSee files in a folder and its subfolders.~/notes
resworb-writeSee, change and delete them../reports/*.md
resworb-netSend and receive data with one server.api.example.com:443
resworb-runRun one program.git
resworb-envGive its programs one variable.AWS_PROFILE
resworb-socketTalk to the program behind one socket./var/run/docker.sock
resworb-nodeFull Node: any file, any program. Only for pages you trust.full

In the popup

  • A broad request, such as ~, *:443, any program
  • A narrower wildcard, such as ~/notes/*.md
  • Everything else, such as ~/logs

The colour depends on how a value is written, not on guesses about where it leads.

Questions

Do I need to know how to code?

No. You say what you want, and your AI writes the app. You read the popup and decide what it may touch.

Which AI can write the apps?

Any coding agent that can write files, such as Claude Code or Codex. Give it the resworb skill and it knows the rest.

What is a .lmth file?

An HTML file with its own extension, so a double-click opens it in resworb, not in your browser. It’s “html” backwards.

Can an app send my files somewhere?

Not on its own. Your operating system blocks the internet for the app and for every program it starts. An app can ask for one server, and the popup tells you first. If you let an app run a program, or give it full Node, that program may still reach the internet through other apps, and the popup says so. SECURITY.md lists everything resworb does not enforce.

Does resworb itself go online?

Only to check GitHub for a new version, at most once a day. Turn it off in Permissions → Check for Updates Automatically. No telemetry, no crash reports.

Can I share an app?

Yes, it’s one file. When someone opens an app they downloaded, the popup shows the site it came from first. If the app asks for a lot, they tick “I trust where this page came from” before it opens.

What if an app changes after I allow it?

If it asks for something new, resworb asks you again and marks what changed. resworb does not check the rest of the file, so an edit that asks for nothing new opens without a popup.

What can an app not do?

Open a second window, or use the camera, microphone, screen capture, notifications or location. Closing its window quits it.

Does it run on Windows?

Not yet. The plan is written down. On Linux there is a .deb for x86-64, tested on a headless Ubuntu 24.04 server but not yet on a desktop.

What does it cost?

Nothing. resworb is free and open source, under the MIT license.

Build the app you wish existed.

Version 0.1.1, signed and notarized for macOS. Release notes and checksums. Then give your AI the resworb skill.