Getting started
Miru is an Elixir/Phoenix application with a PostgreSQL database and somewhere to put files. Everything else is optional.
Requirements
| Component | Version | Notes |
|---|---|---|
| Elixir | 1.19 or newer | Miru sets a floor of ~> 1.19 |
| Erlang/OTP | 27 or newer | |
| PostgreSQL | 14 or newer | The citext extension is used |
| libvips | 8.14 or newer | Image decoding, resizing, metadata |
| FFmpeg | 6 or newer | Video transcoding and thumbnails |
| exiftool | 12 or newer | RAW preview extraction |
| heif-convert | any | HEIC/HEIF decode (libheif examples) |
| dcraw | any | Fallback for RAW files with no embedded preview |
Storage is either an S3-compatible bucket or a directory on disk. Neither is more supported than the other.
The short version
git clone https://forge.oddie.app/oddie-apps/miru_web.git
cd miru_web
mix deps.get
mix ecto.setup # creates the database, migrates, seeds
mix phx.server
That gives you an instance on http://localhost:4077 storing files under
priv/static/uploads, sending no email, and taking no payments. It is enough
to upload a photograph and see what Miru does with it.
For anything you intend to keep, read on — particularly storage and system dependencies, which is where the platform-specific difficulties are.
What the seed data gives you
mix ecto.setup runs priv/repo/seeds.exs, which creates a handful of accounts
with albums and photographs. The images are generated locally and pushed through
the real media pipeline, so what you see is what an actual upload produces —
variants, blurhashes, dominant colours and all.
Seeding is idempotent: running it again does nothing. To start over, use
Miru.Release.reseed/0, which truncates every table first. It refuses to run
against any database or host whose name contains www or prod.
Ports
Miru listens on 4077, not 4000. Set PORT to change it.
Next
- System dependencies — the parts that differ per platform, and what breaks if they are missing
- Storage — S3-compatible buckets and local disk
- Configuration — every environment variable Miru reads