Modern Fashion Store
Inventory and sales dashboard for a clothing company, with live updates for everyone who has it open.
Live demoSource code
Runs on my home server, so it may be offline now and then (for example during a power or internet outage).

About the project
It started in January 2025 as a take-home task in a job application: a stock dashboard for the manager of a clothing shop, in Elixir and Phoenix, a stack I had never used before. I finished both required tasks, all four optional ones and a bonus deployment.
Later I upgraded it, reviewed its security and turned it into a public demo on my own server. Press "Try the demo" to log in; the data resets every night.
What you can try
- Create, edit and delete products with photos, prices, stock and several tags
- Combine filters by tags, price range and availability, search and sort; the filters stay in the URL
- Open the dashboard in two windows and watch changes appear live in the other one
- Transactions grouped by month with a month picker and pagination
- Statistics: this month compared with last month, a 12-month revenue chart, revenue by category and the top three bestsellers
- Charts can be switched to a table for screen readers
- Sizes and colours with their own stock, and discounts planned for a date range with a sale badge and price history
- Edit history with versions you can restore, and Undo for a few minutes after deleting a product
- An activity feed of edits, restocks and sales; a simulated customer buys something every few minutes
- See how many visitors are online, with a warning when someone else is editing the same product
- CSV import that checks every row before saving anything, CSV export of the inventory and transactions
- A printable shelf label with a QR code for every product
- Ctrl+K command palette, dark mode, English, German and Slovak, and installable as an app
Highlights
- Live updates between users with Phoenix PubSub
- Filters for inventory and transactions, bestseller statistics
- Demo login without a shared password, nightly data reset
- Self-hosted with Docker, nginx and Tailscale
Under the hood
- About 320 tests in 46 test files; a pre-commit check runs the compiler with warnings as errors, Credo, the Sobelow security scanner and the tests
- GitHub Actions also runs Dialyzer, builds the release image, scans it with Trivy and publishes it to GHCR; the server only pulls and runs that image
- Write requests rate-limited in nginx, an atomic cap on the number of products, Erlang distribution bound to localhost and an optional database role without superuser rights
- Security review: strict Content Security Policy, an allowlist for photo hosts, limits on WebSocket messages and inputs, server-side demo login with CSRF protection
- Built as a release in a multi-stage Docker image, behind nginx with security headers and rate limits, published through a Tailscale Funnel sidecar with health checks
- View Transitions, screen reader announcements for live changes and support for reduced motion
Architecture
- 1BrowserPages update live over a LiveView WebSocket
- 2Tailscale FunnelPublic HTTPS from a sidecar container
- 3nginxSecurity headers and rate limits
- 4Phoenix LiveViewElixir release; PubSub sends every change to all open pages
- 5PostgreSQLProducts, stock and sales
Changelog
- Phoenix 1.7 to 1.8 and LiveView 1.0 to 1.2
- Tailwind CSS 3 to 4
- Unused libraries removed
- Demo data grew from 10 to 34 products with local photos and a year of sales
- When
- 2025 – 2026
- Type
- Personal
- Versions
- Elixir 1.20
- Phoenix 1.8
- LiveView 1.2
- PostgreSQL 18
- Tailwind CSS 4
- Stack
- Elixir
- Phoenix LiveView
- PostgreSQL
- Tailwind CSS
- Docker
- nginx
- Tailscale
Gallery





