Skip to content
Ákos Kappel
Language: en
Theme
Light
Dark

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).

Product dashboard of the Modern Fashion Store with product photos, prices and stock

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

  1. 1BrowserPages update live over a LiveView WebSocket
  2. 2Tailscale FunnelPublic HTTPS from a sidecar container
  3. 3nginxSecurity headers and rate limits
  4. 4Phoenix LiveViewElixir release; PubSub sends every change to all open pages
  5. 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
Inventory table filtered by the winter tag, with product photos, categories, prices and stock badges
Inventory filtered by a tag, with sale prices and low or empty stock marked.
Product details of a trench coat in a side drawer over the inventory, with a 20 % discount and stock per size
A product opens in a side drawer that has its own link.
Product page of slim fit jeans in the dark theme with stock per size, a sales forecast and a QR code
Product page in the dark theme: stock per size, recent sales and a QR code for the shelf.
Printable shelf label with the product name, price, category and a QR code
A printable shelf label; the QR code opens the product on a phone.
Transactions page with a month picker, sales totals and sales grouped by month
Transactions grouped by month, with totals and CSV export.
Sales statistics with monthly revenue bars and a revenue-by-category donut chart
Statistics: revenue per month and per category, stock warnings and bestsellers.

1 of 6

Inventory table filtered by the winter tag, with product photos, categories, prices and stock badges

Inventory filtered by a tag, with sale prices and low or empty stock marked.