# snonux — Static microblog generator
snonux is the static microblog engine behind [snonux.foo](https://snonux.foo). It processes source files from an input directory into a self-contained static site with paginated HTML pages, an Atom feed, and themed WebGL backgrounds.
## Quick start
```sh
go build -o snonux ./cmd/snonux
./snonux --input ./inbox --output ./dist
```
## Creating posts
Drop files into the input directory (`./inbox` by default). Each file becomes one post. Supported formats:
### Plain text (.txt)
```
inbox/
thoughts.txt
```
The text content is rendered as-is into a post.
### Markdown (.md)
```
inbox/
update.md
```
Standard Markdown is converted to HTML (GitHub Flavored Markdown supported). Raw HTML blocks are passed through.
### Markdown with embedded images
Reference a local image from your Markdown file using standard `` syntax. Place the image file in the same input directory:
```
inbox/
update.md
screenshot.png
```
Where `update.md` contains:
```markdown
Check out this screenshot!

Pretty neat, right?
```
The image file is automatically copied into the post's asset directory, and the `
` src is rewritten to the correct path. The image file is consumed together with the Markdown file and removed from the input directory after processing.
**Note:** The image filename in the Markdown must match the actual file in the inbox. Remote URLs (`http://`, `https://`) are left as-is and not downloaded.
### Images (.png, .jpg, .gif)
```
inbox/
photo.jpg
```
A standalone image file becomes its own post. Images wider than 1024px are downscaled and re-encoded as JPEG at 80% quality.
### Audio (.mp3)
```
inbox/
voice-note.mp3
```
An audio file becomes a post with an embedded HTML5 audio player.
### After processing
All source files are removed from the input directory once they have been successfully processed into the output directory.
## Command-line flags
```
--input DIR Input directory for new source files (default: ./inbox)
--output DIR Output directory for generated site (default: ./dist)
--base-url URL Base URL for Atom feed links (default: https://snonux.foo)
--theme NAME Visual theme, or "random" (default: random)
--sync Rsync output to pi0/pi1 after generation
--list-themes Print available theme names and exit
--version Print version and exit
```
## Themes
Each run can use a different visual theme. Use `--list-themes` to see all available themes, or `--theme random` (the default) to pick one at random.
## Output structure
```
dist/
index.html # Page 1 (newest posts)
page2.html # Page 2, etc.
atom.xml # Atom feed (last 42 entries)
favicon.ico
posts/
2026-04-16-120000/
post.json # Post metadata and rendered HTML
screenshot.png # Asset (if any)
...
```
## License
See [LICENSE](LICENSE).
### Third-party assets
The bundled web fonts listed below are self-hosted. Their theme
stylesheets make no runtime requests to Google Fonts, gstatic, int10h,
or any font CDN. Each bundled font file lives next to its theme stylesheet under
`internal/generator/templates/themes//`, is committed to git,
and is shipped to `dist/themes//` together with a
`FONT_LICENSE.txt` containing the source URL, version/date, and full
attribution.
Bundled web fonts:
- **aurora** — *Manrope* Regular + SemiBold (.woff2, latin+latin-ext) by
Mikhail Sharanda, from [Google Fonts](https://fonts.google.com/specimen/Manrope),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/aurora/FONT_LICENSE.txt](internal/generator/templates/themes/aurora/FONT_LICENSE.txt).
- **dos** — *WebPlus IBM VGA 8x16* (.woff) by VileR, from the
[Ultimate Oldschool PC Font Pack v2.2](https://int10h.org/oldschool-pc-fonts/),
[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/).
See [internal/generator/templates/themes/dos/FONT_LICENSE.txt](internal/generator/templates/themes/dos/FONT_LICENSE.txt).
- **biomech** — *Oxanium* Regular + Bold (.woff2, latin+latin-ext) by
Tyler Finck, from [Google Fonts](https://fonts.google.com/specimen/Oxanium),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/biomech/FONT_LICENSE.txt](internal/generator/templates/themes/biomech/FONT_LICENSE.txt).
- **cosmos** — *Exo 2* Regular + SemiBold (.woff2, latin+latin-ext) by
Natanael Gama, from [Google Fonts](https://fonts.google.com/specimen/Exo+2),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/cosmos/FONT_LICENSE.txt](internal/generator/templates/themes/cosmos/FONT_LICENSE.txt).
- **cathedral** — *Cinzel* Regular and *Spectral* Regular + SemiBold
(.woff2, latin+latin-ext) by Natanael Gama and Production Type, from
Google Fonts ([Cinzel](https://fonts.google.com/specimen/Cinzel),
[Spectral](https://fonts.google.com/specimen/Spectral)),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/cathedral/FONT_LICENSE.txt](internal/generator/templates/themes/cathedral/FONT_LICENSE.txt).
- **matrix** — *VT323* Regular (.woff2, latin+latin-ext) by Peter Hull,
from [Google Fonts](https://fonts.google.com/specimen/VT323),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/matrix/FONT_LICENSE.txt](internal/generator/templates/themes/matrix/FONT_LICENSE.txt).
- **noir** — *Playfair Display* Regular + Bold and *IBM Plex Mono* Regular
(.woff2, latin+latin-ext) by Claus Eggers Sørensen, Mike Abbink, Bold Monday,
and IBM, from Google Fonts
([Playfair Display](https://fonts.google.com/specimen/Playfair+Display),
[IBM Plex Mono](https://fonts.google.com/specimen/IBM+Plex+Mono)),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/noir/FONT_LICENSE.txt](internal/generator/templates/themes/noir/FONT_LICENSE.txt).
- **neon** — *Orbitron* Regular + Medium + Bold (.woff2, latin+latin-ext)
by The Orbitron Project Authors, from
[Google Fonts](https://fonts.google.com/specimen/Orbitron),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/neon/FONT_LICENSE.txt](internal/generator/templates/themes/neon/FONT_LICENSE.txt).
- **ocean** — *Outfit* Regular + Medium (.woff2, latin+latin-ext) by
Rodrigo Fuenzalida, from [Google Fonts](https://fonts.google.com/specimen/Outfit),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/ocean/FONT_LICENSE.txt](internal/generator/templates/themes/ocean/FONT_LICENSE.txt).
- **plasma** — *Rajdhani* Regular + SemiBold (.woff2, latin+latin-ext) by
Indian Type Foundry, from [Google Fonts](https://fonts.google.com/specimen/Rajdhani),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/plasma/FONT_LICENSE.txt](internal/generator/templates/themes/plasma/FONT_LICENSE.txt).
- **retrofuture** — *Orbitron* Regular + Bold and *Share Tech Mono* Regular
(.woff2, latin+latin-ext) by The Orbitron Project Authors and Carrois
Apostrophe, from Google Fonts ([Orbitron](https://fonts.google.com/specimen/Orbitron),
[Share Tech Mono](https://fonts.google.com/specimen/Share+Tech+Mono)),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/retrofuture/FONT_LICENSE.txt](internal/generator/templates/themes/retrofuture/FONT_LICENSE.txt).
- **retro** — *VT323* Regular (.woff2, latin+latin-ext) by Peter Hull,
from [Google Fonts](https://fonts.google.com/specimen/VT323),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/retro/FONT_LICENSE.txt](internal/generator/templates/themes/retro/FONT_LICENSE.txt).
- **surveillance** — *Share Tech Mono* Regular (.woff2, latin+latin-ext)
by Carrois Apostrophe, from [Google Fonts](https://fonts.google.com/specimen/Share+Tech+Mono),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/surveillance/FONT_LICENSE.txt](internal/generator/templates/themes/surveillance/FONT_LICENSE.txt).
- **synthwave** — *Russo One* Regular (.woff2, latin+latin-ext) by
Jovanny Lemonad and *Share Tech Mono* Regular (.woff2, latin+latin-ext) by
Carrois Apostrophe, from Google Fonts
([Russo One](https://fonts.google.com/specimen/Russo+One),
[Share Tech Mono](https://fonts.google.com/specimen/Share+Tech+Mono)),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/synthwave/FONT_LICENSE.txt](internal/generator/templates/themes/synthwave/FONT_LICENSE.txt).
- **spaceage** — *Space Mono* Regular + Bold (.woff2, latin+latin-ext) by
Colophon Foundry, from [Google Fonts](https://fonts.google.com/specimen/Space+Mono),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/spaceage/FONT_LICENSE.txt](internal/generator/templates/themes/spaceage/FONT_LICENSE.txt).
- **terminal** — *JetBrains Mono* Regular + Bold (.woff2, latin+latin-ext) by
JetBrains, from [Google Fonts](https://fonts.google.com/specimen/JetBrains+Mono),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/terminal/FONT_LICENSE.txt](internal/generator/templates/themes/terminal/FONT_LICENSE.txt).
- **tropicale** — *Quicksand* Regular + Medium (.woff2, latin+latin-ext) by
Andrew Paglinawan, from [Google Fonts](https://fonts.google.com/specimen/Quicksand),
[SIL OFL 1.1](https://openfontlicense.org/open-font-license-official-text/).
See [internal/generator/templates/themes/tropicale/FONT_LICENSE.txt](internal/generator/templates/themes/tropicale/FONT_LICENSE.txt).
When adding a new bundled font:
1. Download the actual file (`.woff2` preferred, `.woff` accepted) into
`internal/generator/templates/themes//` and commit it.
2. Add or update `internal/generator/templates/themes//FONT_LICENSE.txt`
with attribution, license, source URL, and version/date.
3. Add an `@font-face` block in that theme's `theme.css` using a
relative `url(...)` to the bundled file.
4. Add a bullet here pointing at the new `FONT_LICENSE.txt`.
The embed pipeline ([internal/generator/templates/embed.go](internal/generator/templates/embed.go))
automatically picks up `*.woff`, `*.woff2`, and `FONT_LICENSE.txt`
inside any theme directory, and `writeThemeAsset` copies them out to
`dist/themes//` — no Go code changes needed for new fonts.