Almanack Root https://almnck.com/
  • Python 44.1%
  • JavaScript 38.1%
  • CSS 7.5%
  • Shell 4.3%
  • HTML 3.4%
  • Other 2.5%
Find a file
Danny O'Brien e4d5561cdc Use invoice.paid event instead of invoice.payment_succeeded
Matches what's registered in the Stripe webhook dashboard.
Both events are equivalent; invoice.paid is Stripe's recommendation.
2026-02-07 01:43:37 -08:00
.claude Add md-age skill and MD_AGE_IDENTITY env var 2026-02-05 22:38:05 -08:00
api Use invoice.paid event instead of invoice.payment_succeeded 2026-02-07 01:43:37 -08:00
assets Wire Stripe secrets to API container at deploy time 2026-02-07 01:34:37 -08:00
bin Fix trailing newline in MD_AGE_IDENTITY 2026-02-05 22:45:18 -08:00
doc Add dates database population strategy 2026-02-05 20:51:15 -08:00
editorial feat: add topup page 2026-02-07 01:23:20 -08:00
llc llc: add 2026 tax filings 2026-01-26 23:16:44 -08:00
src Add ruff linter with Claude Code pre-commit hook 2026-02-04 20:18:49 -08:00
.crates.toml fix: wait for noble crypto libs before initializing identity 2026-01-17 16:29:32 -08:00
.crates2.json fix: wait for noble crypto libs before initializing identity 2026-01-17 16:29:32 -08:00
.gitattributes (md-age) active git auto-encryption 2026-01-30 01:10:54 -08:00
.gitignore chore(assets): update prompts and public keys 2026-01-25 05:18:36 -08:00
CLAUDE.md Document a-date command in CLAUDE.md and improve --help 2026-02-03 23:53:21 -08:00
CONSENSX.md feat: integrate interactive figures into regolith article 2026-01-11 18:20:38 -08:00
Makefile Wire Stripe secrets to API container at deploy time 2026-02-07 01:34:37 -08:00
pyproject.toml feat: wire stripe checkout 2026-02-07 01:24:16 -08:00
README.md Document editor-only content encryption in README 2026-02-01 18:41:53 -08:00
uv.lock feat: wire stripe checkout 2026-02-07 01:24:16 -08:00

Directory structure

bin -- small scripts for managing the stuff below
src -- codebase for generating website or conducting process. Anything bigger than a (small) script.
assets -- IP, including incoming articles, images, currently edited work, final products.
web -- the contents of our (static, public) website.
secrets -- passwords, PII, etc. Assume everything else could be made public. If it would be existentially bad for it to leak, encrypt it, and put it here.
doc -- documentation of processes, ideas, memos, etc.
llc -- corporate documents, financial ledger, business running.
.venv -- python environment for this whole kiboodle.

Quick Start

From a fresh clone:

make bootstrap        # Create venv, install deps, run migrations
source bin/a-activate # Activate the environment
make serve            # Start Django dev server on port 1969

Requires uv for dependency management.

Working Environment

To reactivate an existing environment:

. bin/a-activate

Editor-Only Content

Some content in editorial/inbox/ is encrypted so only editors can read it. This is for unpublished drafts and works-in-progress—not for secrets or confidential information (those belong in secrets/).

Why encrypt drafts?

  • Upcoming articles shouldn't be publicly visible before publication
  • Contributors may share work that isn't ready for the world yet
  • The rest of the repo can remain public without leaking unfinished writing

How it works

We use md-age for transparent encryption. Files with this frontmatter are automatically encrypted in git:

---
age-encrypt: yes
age-recipients:
  - git:assets/keys/editors
---
Your markdown content here...

The git:assets/keys/editors reference points to a file listing editor public keys. When you check out the file, it's automatically decrypted (if you have a matching private key). When you commit, it's re-encrypted.

Setup

Run bin/a-setup-key to configure everything automatically:

bin/a-setup-key

This script:

  • Creates an Ed25519 keypair (~/.ssh/almanack-age) compatible with both SSH and age
  • Configures git to use md-age filters for transparent decrypt/encrypt
  • Adds SSH config for the almnck git server alias
  • Adds your public key to assets/keys/editors and commits it

After running, add the printed public key to your Forgejo account at https://code.almnck.com/user/settings/keys to complete git server access.

Adding a new editor

When a new editor runs a-setup-key, their key is added to assets/keys/editors. Then run md-age git rekey to re-encrypt all protected files with the new recipient.

Current editors

See assets/keys/editors for the list of public keys with access.