Sign in with username, password, and an authenticator code (TOTP). Credentials live in a
local encrypted vault in this browser (not a server or “private” site folder).
Your GitHub token unlocks after 2FA — it is not typed on each login and never committed to the site.
Create admin credentials
One-time setup on this device: choose a username/password, enroll an authenticator app
(Google Authenticator, 1Password, Authy, etc.), and store a fine-grained GitHub token with
Contents: Read and write on
shyamalschandra/shyamalschandra.github.io only.
Everything is encrypted in this browser’s vault — not uploaded to a private directory on Pages
(GitHub Pages has none). Bluesky/Mastodon API secrets stay in GitHub Actions only.
Already have a vault file from another browser?
Sign in
Import encrypted vault
Paste or choose a vault JSON exported from another browser. You will still need the same
password and authenticator to sign in.
Signed in
Body0 / 10000
Tip: on macOS use Control–Command–Space for the system emoji picker. HTML is sanitized on publish
(no scripts).
Manifest posts
Loading manifest…
Queue social post
Enqueue only writes public queue JSON (social/queue/<id>.json) on
main via the GitHub Contents API — no network tokens are stored.
Bluesky and Mastodon credentials are GitHub Actions secrets only; this vault
never holds them. Default dry-run stays on until you uncheck it.
Queued files
Sign in to load queue…
Newsletter
Morning duty cycle via Actions cron (13:00 UTC). The workflow job is the microservice:
wake → build campaign from the blog → deliver or dry-run → exit. Default
NEWSLETTER_DRY_RUN=true writes drafts under
newsletter/campaigns
(excluded from Pages) and does not email subscribers. Private subscribers
live on the newsletter-data
branch (not published on Pages). Production stack is Listmonk → Postal on a VPS
(Actions orchestrates; Postal is not on GitHub). Listmonk remains preferred when
LISTMONK_URL is set; SMTP fallback uses NEWSLETTER_DELIVERY=smtp —
see newsletter/README.md.
Actions workflow:
Newsletter workflow
— use Run workflow (workflow_dispatch) with
dry_run: true for a rehearsal, or set Listmonk/SMTP secrets +
dry_run: false for live.
Subscribers
Delivery mode: sign in to detect (dry-run / smtp / listmonk). Live mode is controlled by
Actions secrets, not this UI.