Portfolio website engine built on nix + leptos ❄️🦀
  • Rust 87.2%
  • Nix 6.8%
  • HTML 2.8%
  • CSS 1.7%
  • Shell 0.6%
  • Other 0.8%
Find a file
Can H. Tartanoglu 316b96c0b6
fix: bump wasm-bindgen to 0.2.125, upgrade sqlx to 0.9
- wasmBindgenVersion: 0.2.114 -> 0.2.125 (match Cargo.lock)
- sqlx workspace dep: 0.8 -> 0.9 (eliminate dual-version conflict
  with pgvector 0.4.2 which requires sqlx >=0.9)
2026-06-27 12:59:29 +02:00
.agents Refresh generated project skill views 2026-06-11 11:19:04 +02:00
.cargo fix: expose per-system lib with plinthProject for downstream .lib.${system}.access 2026-06-16 22:19:39 +02:00
.claude/skills fix pcomfy build: add missing mod generate, fix serde_yaml as_array → as_sequence, remove unused var 2026-06-23 19:01:12 +02:00
.forgejo/workflows Manage Plinth Pages deployment with simit 2026-06-14 23:27:34 +02:00
.skills Add activity docs and planning notes 2026-06-03 14:14:18 +02:00
crates pcomfy: use gray_matter::engine::YAML type annotation 2026-06-24 23:18:31 +02:00
csr Add rendering modes and CSR support 2026-06-03 18:54:21 +02:00
docs Add project-site theme and workflow bricks 2026-06-07 22:13:41 +02:00
e2e checkpoint 2026-03-03 22:29:52 +01:00
logo checkpoint 2026-03-03 22:29:52 +01:00
modules style: cargo fmt 2026-06-16 17:27:21 +02:00
nix Add Plinth site check registry 2026-06-14 23:27:01 +02:00
public checkpoint 2026-04-12 10:52:40 +02:00
scripts Add rendering modes and CSR support 2026-06-03 18:54:21 +02:00
website Generate portfolio metadata from project registry 2026-06-11 21:06:44 +02:00
.envrc checkpoint 2026-02-13 09:14:23 +01:00
.gitignore Ignore generated project site output 2026-06-08 14:31:59 +02:00
.woodpecker.yml checkpoint 2026-03-03 22:29:52 +01:00
AGENTS.md Document portfolio publish manifests 2026-05-28 18:31:22 +02:00
Cargo.lock fix: bump wasm-bindgen to 0.2.125, upgrade sqlx to 0.9 2026-06-27 12:59:29 +02:00
Cargo.toml fix: bump wasm-bindgen to 0.2.125, upgrade sqlx to 0.9 2026-06-27 12:59:29 +02:00
flake.lock fix pcomfy build: add missing mod generate, fix serde_yaml as_array → as_sequence, remove unused var 2026-06-23 19:01:12 +02:00
flake.nix fix: bump wasm-bindgen to 0.2.125, upgrade sqlx to 0.9 2026-06-27 12:59:29 +02:00
input.css style: cargo fmt 2026-06-16 17:27:21 +02:00
justfile checkpoint 2026-03-03 22:29:52 +01:00
LICENSE docs: add LICENSE (EUPL-1.2) and CI section to README 2026-04-13 15:02:45 +02:00
plinth.code-workspace checkpoint 2026-03-03 22:29:52 +01:00
plinth.toml Add forge-backed activity brick 2026-06-03 14:14:02 +02:00
README.md docs: document Postgres dev-db.sh workflow in README and quick-start 2026-05-19 22:15:59 +02:00

Plinth

A full-stack personal website platform built with Leptos 0.8

Codeberg · Documentation


Plinth is a self-hosted personal website and blog engine written in Rust. It uses Leptos for server-side rendering with WASM hydration, Postgres with pgvector for storage and similarity search, and supports authoring blog posts in both Markdown and Typst.

Features

  • SSR + WASM hydration — fast initial load with an interactive client
  • Postgres + pgvector — relational storage with HNSW-indexed semantic search
  • Semantic search — fastembed vector embeddings, cosine similarity in pgvector
  • Typst support — author blog posts in Typst with image management
  • Immich integration — self-hosted image proxy with aggressive caching
  • NixOS module — declarative deployment with systemd hardening
  • Plausible analytics — optional self-hosted Plausible integration
  • OTLP observability — built-in OpenTelemetry tracing export

Quick start

git clone https://codeberg.org/caniko/plinth.git
cd plinth
nix develop
./scripts/dev-db.sh start
cargo leptos watch

Open http://127.0.0.1:3000 to see your site. Publish a post:

cargo run --package plinth-cli -- publish my-post.md

Build for production

nix build .#plinth

Output in result/:

Path Contents
result/bin/plinth-server Server binary (sets LEPTOS_SITE_ROOT automatically)
result/site/ Compiled WASM, JS, CSS, and static assets
result/share/plinth/plinth.toml Example configuration

Architecture

Four-crate Rust workspace:

Crate Role
plinth-shared Domain types shared across all crates
plinth-client Leptos frontend compiled to WASM
plinth-server Axum HTTP server with Leptos SSR, Kameo actors, Postgres + pgvector
plinth-cli CLI for publishing Markdown/Typst articles with embeddings

Configuration

Configure via plinth.toml and environment variables. See the configuration docs for all options.

Key environment variables:

Variable Default Purpose
DATABASE_URL postgres://plinth:plinth@localhost:5432/plinth Postgres connection URL
PLINTH_API_KEY dev_api_key_change_in_production Admin API auth
LEPTOS_SITE_ADDR 127.0.0.1:3000 Server bind address
IMMICH_API_URL Immich server URL for image proxy
PLAUSIBLE_DOMAIN Site domain for Plausible analytics
PLAUSIBLE_SCRIPT_URL URL to self-hosted Plausible script

Deployment

Plinth includes a NixOS module for declarative deployment:

{
  services.plinth = {
    enable = true;
    settings.site.name = "My Site";
  };
}

See deployment docs for full options including reverse proxy setup.

CI

Woodpecker CI on Codeberg runs nix flake check (build, clippy, fmt, and tests) on every push and pull request.

License

EUPL-1.2. See LICENSE for details.