Personal website and blog built with Zola, a fast static site generator written in Rust.
This project uses Nix flakes for reproducible development environment and Just as a command runner.
- Clone the repository with submodules:
If you already cloned it without submodules:
git clone --recurse-submodules https://github.com/rhnvrm/rohanverma.net.git cd rohanverma.netgit submodule update --init --recursive
- Enter the development shell:
nix develop
Using Just command runner:
just # Show available commands
just serve # Start Zola development server
just admin # Start local-only Markdown editor on port 1112
just build # Build Zola site
just check # Check available tools and versions
just clean # Clean build artifactsThe justfile will automatically detect if you're running in a Nix shell and enter it if necessary.
Direct commands (within nix develop):
zola serve # Development server
zola build # Build for productionRun just admin in a second terminal while just serve-drafts (or just bg) is running. Open http://127.0.0.1:1112/admin/ to create drafts, edit blog posts or pages, preview them through Zola, and change content between draft and public. The same local origin proxies the actual Zola site at /, injects local-only in-page editing controls, and shows a live preview beside the Markdown editor. If port 1112 is occupied, use ADMIN_PORT=33447 just admin and open that port instead. The editor is provided by Doordarshan's dev/ tooling, binds only to loopback, and writes only Markdown under content/blog/ and content/pages/; it does not commit, push, or deploy anything.
content/- Content (markdown files)- Blog posts (2010-2021)
- Projects with images
- Static pages (contact, now, etc.)
templates/- Site-level Zola overrides/hookssass/- Sass stylesheetsstatic/- Static assets (images, files, etc.)themes/doordarshan/- External theme submodule fromoddship/doordarshan-zolaconfig.toml- Zola configurationflake.nix- Nix development environmentjustfile- Development task definitionsai/- Project documentation
Production now deploys through s3site hosted on oddship-web.
The deploy workflow is:
.github/workflows/deploy-s3site.yml
That workflow expects these GitHub secrets:
TS_OAUTH_CLIENT_IDTS_OAUTH_SECRET(OAuth client must be allowed to usetag:gh-ci)S3SITE_ACCESS_KEY_IDS3SITE_SECRET_ACCESS_KEY
It builds the site, joins the tailnet with the Tailscale GitHub Action, uploads sites/rohanverma.net.tar.gz to Garage at http://rhnvrm-private:3900, verifies the object exists, and then lets oddship-web pick it up on the next s3site poll.
The workflow runs on every push to master and can also be triggered manually with workflow_dispatch.
Before using it, oddship-web must have:
- the
s3siteservice enabled services.s3site.poll = "5m";(or another interval you are comfortable with)- agenix-managed
oddship-web-s3site-env.agewith the Garage runtime credentials - agenix-managed
oddship-web-tailscale-auth.agewith the raw OAuth client secret so the host can join the tailnet and reach Garage privately
Content © Rohan Verma. Code is available under MIT license.
See the live site at rohanverma.net