aprs.me/CLAUDE.md

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 dependencies
  • mix ecto.setup - Create database, run migrations, and seed data
  • mix ecto.reset - Drop and recreate database
  • mix 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 suite
  • mix test --stale - Run only tests affected by code changes
  • mix test.watch - Continuous testing with file watching
  • mix test --cover - Generate test coverage reports

Code Quality

  • mix format - Format code according to .formatter.exs
  • mix credo - Static code analysis and style checking
  • mix dialyzer - Static type analysis (must run and fix errors/warnings)
  • mix sobelow - Security vulnerability scanning
  • IMPORTANT: Always run mix format before considering any task complete
  • MANDATORY: Run mix compile --warnings-as-errors and 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

  1. APRS-IS connection receives packets via TCP
  2. PacketConsumer processes packets through GenStage pipeline
  3. Packets stored in PostgreSQL with PostGIS geographic indexing
  4. LiveView broadcasts real-time updates to connected clients via PubSub
  5. 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:

  1. Red Phase: Write failing tests first before implementing any functionality
  2. Green Phase: Write minimal code to make tests pass
  3. 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 test frequently during development
  • Use mix test.watch for 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 format before committing
  • Address any compiler warnings
  • Run mix dialyzer and fix all errors/warnings
  • MANDATORY: Run mix compile --warnings-as-errors and 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.