# Development Setup ## Prerequisites - Elixir 1.17+ - Erlang/OTP 26+ - PostgreSQL 16+ with PostGIS extension - Node.js 20+ (for asset compilation) ## Quick Start ```bash # Clone and cd git clone cd aprs.me # Install dependencies and set up database mix setup # Start dev server mix phx.server # or with IEx: iex -S mix phx.server ``` The application will be available at `http://localhost:4000`. ## Nix Development Environment (Optional) A reproducible development environment is available via Nix: ```bash nix develop # or with direnv: direnv allow ``` This provides all required tooling (Elixir, Erlang, PostgreSQL, Node.js) without manual installation. ## Database Setup The `mix setup` command: 1. Installs Hex and Rebar dependencies 2. Fetches Elixir dependencies 3. Creates the development database 4. Runs migrations 5. Seeds device data ### Manual Database Setup ```bash mix ecto.create mix ecto.migrate mix run priv/repo/seeds.exs ``` **Important:** PostGIS extension must be enabled on the database. The migration pipeline handles this, but ensure your PostgreSQL installation includes PostGIS. ## Running Tests ```bash # Full test suite mix test # Watch mode (auto-rerun on changes) mix test.watch # Coverage report mix coveralls.html # View at cover/excoveralls.html ``` ## Code Quality ```bash # Format code mix format # Static analysis mix credo --strict # Type checking mix dialyzer # Security scan mix sobelow ``` ## Asset Compilation Frontend assets use ESBuild + Tailwind CSS v4: ```bash # Development (watch mode) mix assets.build # Production MIX_ENV=prod mix assets.deploy ``` JavaScript entry points are in `assets/js/`: - `app.ts` — Core application (always loaded) - `map.ts` — Map functionality (lazy-loaded) - `map_helpers.ts` — Leaflet utilities - `map_fixes.ts` — Leaflet bug workarounds CSS: Tailwind v4 in `assets/css/app.css` with custom dark mode and Leaflet overrides. ## Useful Commands | Command | Purpose | |---|---| | `mix phx.server` | Start dev server | | `iex -S mix phx.server` | Start with interactive shell | | `mix test` | Run test suite | | `mix test.watch` | Auto-rerun tests on changes | | `mix format` | Format Elixir code | | `mix credo --strict` | Lint check | | `mix dialyzer` | Type checking | | `mix sobelow` | Security scan | | `mix coveralls.html` | Test coverage report | | `mix phx.routes` | List all routes | | `mix ecto.migrate` | Run pending migrations | | `mix ecto.rollback` | Rollback last migration | | `mix parse_file ` | Parse raw APRS log file | ## Project Structure See [AGENTS.md](../../AGENTS.md) for coding conventions, and [Architecture Overview](../architecture/overview.md) for system design.