Show HN: An outliner where S3 is the database and there's no server

laurentenhoor1 pts0 comments

is parsed<br>before a single module runs. js/brand.ts is the source of truth, and<br>test/brand.test.ts holds this file and the manifest to it.

WHAT COMES AFTER THE NAME is the search result's own headline, and it is<br>the one line of this page a search engine weighs most. "an outliner" was<br>accurate and told a reader nothing they would have typed into a search<br>box; this says what it is for in the words somebody looking for it would<br>use. The rest of what a crawler reads — description, canonical, the share<br>card — is injected from the PAGES table in seo.vite.ts. --><br>bulletlist.org — a free outliner for notes, plans and lists<br>/>

The theme-color line reads the resolved `--bg` back off the document, so<br>it needs the stylesheet to have landed — and where the stylesheet sits is<br>not ours to decide: vite MOVES the emitted `` to the end of ,<br>past anything written above it. Top of is after it in the built<br>page and after the hand-written `` in dev, so one position serves<br>both. It is still before every element below and therefore before any<br>paint; a script after a stylesheet also waits for it, which is what makes<br>the read below meaningful rather than lucky.

THE KEY IS SPELLED OUT because a plain script cannot import js/brand.ts,<br>exactly as the title and the manifest name are; test/theme.test.ts holds it<br>to `key("settings")` and runs the body of this script against real records.<br>Everything is guarded: a denied localStorage (private mode) or a record<br>some future version wrote must leave the app booting, and an unrecognised<br>palette id matches no rule in web/css/palettes.css, so the worst a bad value<br>can do is fall through to the default. -->

. It is inside `#app`<br>rather than beside it because `showLanding()` clears `#app` before<br>mounting — one line already removes this, and nothing has to remember<br>to.

TWO RULES, and they are not style points. It says only what the landing<br>page says, in the landing page's own words: a that promised<br>something the rendered page does not is cloaking, and it is the kind<br>search engines actually penalise. And it stays SHORT — this is a<br>fallback for a machine and a courtesy to the rare no-JS reader, not a<br>second copy of the site to keep in step with the first. test/seo.test.ts<br>holds the headline here to the in Landing.svelte. -->

A simple list that holds your whole life.

An infinitely nested outliner. Every bullet is a page. Free — not<br>freemium.

Keyboard-first. Every action has a key, and ⌘K jumps to any bullet by name.

Bring your own outline. Paste from Workflowy, Notion or markdown, or drop in an OPML export.

Yours to keep. Works offline, saves to your device first, and exports as plain text or OPML any time.

bulletlist.org needs JavaScript to run. Read the docs<br>for what it does and the full shortcut list, or the<br>privacy policy for what it stores.

test page outliner before holds after

Related Articles