4.7 KiB
4.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is an Elixir Phoenix LiveView application that serves as a real-time APRS (Automatic Packet Reporting System) tracker and visualizer. It connects to the APRS-IS network to receive live amateur radio packets and displays them on an interactive map interface.
Development Commands
Setup
mix setup- Complete project setup (deps.get + ecto.setup)mix deps.get- Install dependenciesmix ecto.setup- Create database, run migrations, and seed datamix ecto.reset- Drop and recreate databasemix phx.server- Start Phoenix server (http://localhost:4000)iex -S mix phx.server- Start server in interactive Elixir shell
Testing
mix test- Run full test suitemix test --stale- Run only tests affected by code changesmix test.watch- Continuous testing with file watchingmix test --cover- Generate test coverage reports
Code Quality
mix format- Format code according to .formatter.exsmix credo- Static code analysis and style checkingmix dialyzer- Static type analysis (must run and fix errors/warnings)mix sobelow- Security vulnerability scanning- IMPORTANT: Always run
mix formatbefore considering any task complete - MANDATORY: Run
mix compile --warnings-as-errorsand ensure it passes before considering any task complete
Assets (No Node.js)
mix assets.deploy- Build and minify frontend assets (Tailwind CSS + ESBuild)- Phoenix uses ESBuild directly without Node.js package managers
Architecture
Core Components
- Aprsme.AprsIsConnection - TCP connection to APRS-IS network with reconnection logic
- Aprsme.PacketConsumer - Processes incoming APRS packets using GenStage pipeline
- Aprsme.Packet - Database schema for APRS packets with PostGIS geographic data
- AprsmeWeb.MapLive.Index - Main real-time map interface using Phoenix LiveView
- Aprsme.Workers.PacketCleanupWorker - Oban background job for data cleanup
Data Flow
- APRS-IS connection receives packets via TCP
- PacketConsumer processes packets through GenStage pipeline
- Packets stored in PostgreSQL with PostGIS geographic indexing
- LiveView broadcasts real-time updates to connected clients via PubSub
- Background workers handle cleanup and maintenance tasks
Key Dependencies
- Phoenix LiveView for real-time UI without JavaScript
- PostGIS for geographic data storage and spatial queries
- Oban for background job processing
- GenStage for packet processing pipelines
- Tailwind CSS + ESBuild for frontend assets (no Node.js)
Test-Driven Development
MANDATORY: Follow strict test-driven development (TDD) practices:
- Red Phase: Write failing tests first before implementing any functionality
- Green Phase: Write minimal code to make tests pass
- Refactor Phase: Improve code while keeping tests green
TDD Workflow
- Always write tests before implementing new features or fixing bugs
- Start with the simplest failing test case
- Write only enough code to make the test pass
- Refactor with confidence knowing tests will catch regressions
- Run
mix testfrequently during development - Use
mix test.watchfor continuous feedback
Testing Patterns
Tests use comprehensive mocking to prevent external connections:
- APRS-IS connections are mocked in test environment
- Database uses sandbox mode for isolation
- External API calls mocked with Mox library
- Write unit tests for business logic, integration tests for workflows
- Test edge cases and error conditions thoroughly
- Maintain high test coverage with
mix test --cover
Code Style Guidelines
- CRITICAL: Never write production code without tests first
- Use LiveView for UI interactions, minimize JavaScript
- Prefer pattern matching over if/case statements
- Follow idiomatic Elixir conventions
- Run
mix formatbefore committing - Address any compiler warnings
- Run
mix dialyzerand fix all errors/warnings - MANDATORY: Run
mix compile --warnings-as-errorsand ensure it passes before considering any task complete - Use function composition over nested conditionals
- Write descriptive test names that explain behavior
Web Testing
- MANDATORY: When viewing any website or web application, always use Puppeteer to take screenshots and interact with the page
- Use
mcp__puppeteer__puppeteer_navigate,mcp__puppeteer__puppeteer_screenshot, and other Puppeteer tools - This ensures accurate visual feedback and proper testing of the user interface
Deployment
The application supports Kubernetes deployment with manifests in k8s/ directory and GitHub Actions CI/CD pipeline. Database migrations run automatically via init containers.