Personal blog and portfolio site built with Phoenix LiveView, SQLite, and LiteFS.
Live at vereis.com
Phoenix umbrella application with two apps:
| App | Description |
|---|---|
| blog | Core domain logic - posts, projects, assets, tags |
| blog_web | Phoenix web interface - LiveView pages, components |
- Framework: Phoenix 1.8 with LiveView
- Database: SQLite with Ecto
- Distributed: LiteFS replication via EctoLiteFS
- Markdown: MDEx with syntax highlighting
- Images: Vix (libvips) + CSS-only LQIP
- Hosting: Fly.io
The project includes a Nix flake for reproducible development environments:
# Enter dev shell (or use direnv)
nix develop
# Install dependencies and setup
mix setup
# Start Phoenix server
mix phx.serverThe flake provides Elixir, Erlang, Rust (for native dependencies), and platform-specific tools automatically.
Requires:
- Elixir 1.17+
- Erlang/OTP 27+
- Rust (nightly, for MDEx)
- libvips (for image processing)
mix setup
mix phx.serverVisit localhost:4000.
# Run tests
mix test
# Pre-commit checks (format, lint, dialyzer, test)
make precommit
# Generate new blog post
mix blog.gen.post "My Post Title"- Posts: Markdown files in
apps/blog/priv/posts/ - Projects: YAML config in
apps/blog/priv/projects/projects.yaml - Assets: Images in
apps/blog/priv/assets/
See apps/blog/README.md for content format details.
Deployed to Fly.io with distributed SQLite via LiteFS:
make deploy # Deploy to Fly.io
make logs # Tail logs (all regions)
make ssh # SSH into instance
make remote # Open IEx remote shellConfiguration in fly.toml and litefs.yml.
This blog uses several open-source libraries I maintain:
| Project | Description |
|---|---|
| EctoLiteFS | LiteFS-aware Ecto middleware for automatic write forwarding |
| EctoMiddleware | Middleware pipeline pattern for Ecto operations |
| EctoHooks | Before/after callbacks for Ecto schemas |
MIT
