Modern Fashion Store
Inventory and sales dashboard for a clothing company, with live updates for everyone who has it open.

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
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 240 tests in 32 test files; a pre-commit check runs the compiler with warnings as errors, Credo, the Sobelow security scanner and the tests
- 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 24 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

