A private, browser-native desktop for single-file tools. Apps stay standalone; nakliOS gives them a home — a spotlight (⌘K), themed wallpapers, folders, a dock, sticky notes, and an Immersive mode where cooperative apps feel native inside the OS instead of foreign in iframes.
Try it: naklios.dev
40-odd privacy-first tools, games, and utilities — each a single HTML file that runs entirely in your tab. The NakliTechie collection is the first apps nakliOS hosts. No build step, no backend, no telemetry.
- Basic — built-in classics (Minesweeper, Solitaire, Calculator, Notepad, Spider) open as inline windows; everything else opens a new tab. Default.
- Immersive (experimental) — light apps open as iframe windows inside the desktop.
One line in the APPS array at the top of index.html:
{ id:'mynewapp', name:'MyNewApp', url:'https://mynewapp.naklitechie.com',
glyph:'✨', bg:'brand',
description:'One-sentence pitch.',
tags:['tool','ai'] }Optional fields: maxMode:'basic', iframeable:false, private:true, kind:'classic', desktopAlign:'right' + desktopOrder:N, svg:'<path d=…>', embedUrl:'https://naklios.dev/apps/<id>/' (same-origin mirror for FSA-needing apps; see apps/manifest.json).
Cross-origin iframes can't invoke showDirectoryPicker(). To embed a File-System-Access-using app inside Immersive mode, mirror it under apps/<id>/ so it loads from naklios.dev itself.
-
Add an entry to
apps/manifest.jsonpointing at the upstream repo/branch/file. -
Set
embedUrl: 'https://naklios.dev/apps/<id>/'on the app'sAPPSentry inindex.html. -
In the upstream source repo, add a small dispatcher workflow at
.github/workflows/notify-naklios.yml:name: Notify nakliOS to re-mirror on: push: branches: [main] paths: ['index.html'] jobs: trigger: runs-on: ubuntu-latest steps: - run: gh workflow run sync-mirrors.yml --repo NakliTechie/nakli-dev --ref main env: GH_TOKEN: ${{ secrets.NAKLIOS_DISPATCH_TOKEN }}
-
In that same source repo, add the secret
NAKLIOS_DISPATCH_TOKEN(Settings → Secrets and variables → Actions). It's a fine-grained PAT with Actions: Read and write onNakliTechie/nakli-dev. The same PAT can be reused across every source repo. -
Run
bash scripts/sync-mirrors.shlocally once to seed the initial mirror, then commit.
When a source repo pushes to main with a change to index.html, its dispatcher fires gh workflow run against nakli-dev. The Sync app mirrors workflow pulls every mirrored app's latest index.html, opens a PR if anything drifted. You review + merge → Cloudflare redeploys naklios.dev with the fresh mirror.
The Immersive iframe drops its sandbox and uses the mirror; standalone visits and new-tab opens continue to use the canonical url.
Manual trigger anytime: Actions tab → Sync app mirrors → Run workflow.
Cooperative apps that want persistent state use the naklios.fs.* SDK surface. The host fulfils those calls with one of two backends, configured in Settings:
- Folder (local) — a directory you pick via File System Access. Lives on disk. Multi-device only via iCloud Drive / Dropbox / Google Drive of your choice.
- Crate (cloud, encrypted) — BYOK end-to-end-encrypted folder on Cloudflare R2 (or any S3-compatible bucket). Multi-device sync is built in. Set up your bucket + download the
.crate-credsfile from crate.naklios.dev, then connect it here.
Both can be connected at the same time. On first use, each app is asked which backend to store its data in — choice is remembered per-app and switchable later. Apps see the same apps/<id>/ layout regardless of backend, so the same source code works against either.
The Crate ESM modules are vendored under vendor/crate/ and loaded dynamically the first time the user clicks Connect Crate — zero cost for users who don't opt in.
MIT. See LICENSE.
Part of the NakliTechie series — single-file, browser-native, no-backend tools.