Open a terminal. Write one page. Publish it. Learn what happened.
Not a website builder that hides the work. Every step leaves you with something ordinary you own: a Markdown file, a Git repository, and a static website. Delete kosong tomorrow and all three still work.
Everything local works with no account and no networkThree ways. They install the same binary, from the same release, checked against the same published checksum.
The middle line is not optional and not a formality: Homebrew refuses to load formulae from taps outside its own repositories until you say you trust them. Skip it and brew install stops with an error rather than installing anything.
npx kosong start runs it without installing anything permanently. Installed this way, kosong is a small script that starts the real binary, which costs a fraction of a second per command.
Needs neither Homebrew nor Node.
Piping a script into your shell deserves suspicion. This one downloads a fixed release and refuses to install anything whose checksum does not match — read it first, or install manually from a release and verify it yourself:
macOS and Linux, on Intel and ARM. Windows and Alpine are not among them, and on those the install stops with a message saying so rather than leaving you something that cannot run.
Nothing above touches the network or asks who you are.
| Command | What it does | What it teaches |
|---|---|---|
kosong start | Set things up, one step at a time | — |
kosong new | Create a page | A file is a durable object you can move |
kosong edit | Open your editor | The terminal opens editors; it is not one |
kosong preview | Serve it locally | A local server is a temporary website |
kosong status | Report current state | Software can describe itself |
kosong doctor | Check your setup | Prerequisites can be checked, not guessed |
kosong login | Sign in by email code | — |
kosong sync | Keep a private remote copy | — |
kosong delete-account | Delete your account and its stored page | Deleting an account is not deleting your files |
kosong site init | Make a publishable folder | Git tracks a folder's history |
kosong site publish | Build and deploy | A place must exist before files go in it. Deployment moves files, not magic |
kosong site rollback | See past versions, and where to restore one | An honest limit beats a convincing wrong answer |
| Thing | Where | Works without kosong |
|---|---|---|
| Your page | kosong.md | Any Markdown editor |
| Your site | <name>/ | An ordinary Astro project |
| Its history | <name>/.git | Ordinary git |
| The built files | <name>/dist | Plain HTML |
Every external tool is invoked as an executable plus separate arguments, so a ; in a name is a character, not a command. There is nosh -c anywhere in the codebase.
Wrangler has no command for it, and doing it through Cloudflare's API would mean holding your Cloudflare credentials — which kosong is built never to do. kosong site rollback shows your deployment history and tells you exactly where to click instead.
The supplemental course, module by module. This is the curriculum — what each module teaches, which commands it is built on, and what the le…
The boundarykosong publishes to services you own accounts with. This page says exactly what it asks them to do, what it refuses to do, and why the refus…
When it breaksFind what you saw on your screen. Every entry says what happened, what to do, and — because knowing why is the point — what the failure was …
kosong uses HTTPS, encryption at rest, private storage, verified-email sign-in, hashed single-use codes, short-lived access tokens, and rotating refresh tokens.
It is not end-to-end encrypted. The service operator could read a synced document. If that matters to you, do not sync — everything local works without it. SeeSECURITY.md for the full boundary.