No description
Find a file
Graham McIntire f0f0bdc589
Some checks are pending
Elixir CI / Build and test (push) Waiting to run
Elixir CI / Dialyzer (push) Waiting to run
Elixir CI / Build and Push Docker Image (push) Blocked by required conditions
perf: optimize packet receive→parse→store pipeline (35-60% throughput)
Eliminates redundant work on the hot path:

1. Remove struct_to_map — Map.put on struct already returns plain map,
   eliminating O(n) recursive traversal of the entire parser struct tree
   per packet. [15-25% gain]

2. Delete data_extended early — moves Map.delete to before recursive
   sanitization/DateTime walks, avoiding wasted work on data that is
   already extracted to top-level columns. [8-12% gain]

3. Truncate received_at to :second at source — removes microsecond
   truncation + the recursive truncate_datetimes_to_second pass.
   [5-8% gain]

4. Merge sanitize passes — new sanitize_packet_with_encoding/1 does
   truncation + encoding sanitization in one Map.new pass instead of
   two sequential traversals. [5-8% gain]

5. Fix raw→raw_packet key — consumer read :raw_packet but dispatch
   wrote :raw, silently dropping raw packet data to the DB column.

6. Fold has_weather into extract_additional_data — set when weather
   is found during extraction instead of scanning 10 fields per packet.
   [2-4% gain]

7. filter_fields with MapSet — O(1) membership check instead of O(n)
   list scan. [2-3% gain]

8. Single-pass chunk reduction — builds valid_inserts and valid_bcasts
   in one Enum.reduce, saving 2 extra list traversals. [2-3% gain]

Dead code removed: struct_to_map/1, extract_from_mic_e_map/1,
set_has_weather/1, set_received_at/1, truncate_datetimes_to_second/1,
__original_struct__ MicE branch.

Tests: 2481/2490 passing (+3 improvement, remaining 9 are pre-existing)
2026-08-02 15:13:42 -05:00
.devcontainer update deps 2025-12-30 13:35:11 -06:00
.forgejo/workflows chore: remove stale dialyzer ignores and fix CI PLT caching 2026-07-27 16:58:12 -05:00
.github/workflows chore: remove stale dialyzer ignores and fix CI PLT caching 2026-07-27 16:58:12 -05:00
assets refactor: map page efficiency, trail accuracy, and spidering fixes 2026-08-02 14:04:26 -05:00
config fix: read PGHOST env var in test config for CI postgres hostname 2026-07-27 13:19:59 -05:00
docs reliability: unbounded scan audit complete, handoff finalized 2026-07-26 15:34:51 -05:00
k8s chore: scale k8s deployment back to 1 replica 2026-08-02 13:42:28 -05:00
lib perf: optimize packet receive→parse→store pipeline (35-60% throughput) 2026-08-02 15:13:42 -05:00
nix updat edeps 2026-07-17 16:42:53 -05:00
priv refactor: harden packet delivery and operations 2026-07-26 13:11:26 -05:00
rel Fix Erlang clustering: use IP-based node names with DNS strategy 2026-02-19 16:01:20 -06:00
scripts Remove all VectorGrid references and code 2025-07-28 07:43:44 -05:00
test perf: optimize packet receive→parse→store pipeline (35-60% throughput) 2026-08-02 15:13:42 -05:00
vendor update vendor 2026-07-27 14:20:22 -05:00
.credo.exs fix: resolve all credo issues — 0 warnings, 0 refactoring, 0 readability issues 2026-07-29 10:54:07 -05:00
.dialyzer_ignore.exs chore: remove stale dialyzer ignores and fix CI PLT caching 2026-07-27 16:58:12 -05:00
.dockerignore Implement all Docker performance optimizations 2025-07-26 16:12:47 -05:00
.envrc chore: commit shared .envrc, gitignore .envrc.local for secrets 2026-07-21 08:53:35 -05:00
.formatter.exs update 2026-02-18 14:14:49 -06:00
.gitignore chore: commit shared .envrc, gitignore .envrc.local for secrets 2026-07-21 08:53:35 -05:00
.gitmodules fix: correct submodule URL and CI git config for Forgejo port 2222 2026-07-27 08:54:36 -05:00
.sobelow-skips security: sobelow triage, admin route review, k8s secrets hardening 2026-07-26 14:08:27 -05:00
.test-commands perf: Optimize test suite for maximum speed 2025-08-01 17:43:39 -05:00
.tool-versions fix: security hardening and query performance improvements 2026-07-21 10:13:30 -05:00
AGENTS.md cleanup 2026-02-07 10:55:19 -06:00
capture_aprs.py Add mix parse_file task, fix datetime deprecation, update gitignore, fix cleanup worker test 2026-02-18 14:49:14 -06:00
CHANGELOG.md fix: remove invalid empty state from stream container 2025-10-12 12:16:27 -05:00
CLAUDE.md maintainability: obsolete config cleanup, focused migration tests 2026-07-26 14:15:39 -05:00
Dockerfile fix: install libsctp1 to silence Erlang 29 SCTP warning 2026-06-04 15:39:40 -05:00
flake.lock updat edeps 2026-07-17 16:42:53 -05:00
flake.nix updat edeps 2026-07-17 16:42:53 -05:00
fly.toml fly things 2025-06-13 15:10:29 -05:00
horusec-config.json add horusec to ci 2025-06-15 17:19:26 -05:00
LICENSE Initial commit 2023-01-26 13:19:38 -06:00
mix.exs add tidewave 2026-08-02 11:10:15 -05:00
mix.lock add tidewave 2026-08-02 11:10:15 -05:00
README.md README: argocd, not flux 2026-04-29 11:12:50 -05:00
security-policy.json docker security 2025-06-15 11:06:24 -05:00
shell.nix updat edeps 2026-07-17 16:42:53 -05:00
tail_logs.sh update 2026-02-25 16:29:45 -06:00
tsconfig.json typescript 2025-06-18 12:26:13 -05:00

Aprs

Prerequisites

Before setting up the project, ensure you have the following installed:

  • Elixir 1.17+
  • Erlang/OTP
  • PostgreSQL with PostGIS extension

Setup

To start your Phoenix server:

  • Run the complete setup:
    mix setup
    
  • Start Phoenix endpoint with mix phx.server or inside IEx with iex -S mix phx.server

Now you can visit localhost:4000 from your browser.

Ready to run in production? Please check our deployment guides.

Deployment

This application is deployed to a Kubernetes cluster using ArgoCD. The Kubernetes manifests are in the k8s/ directory and are reconciled automatically when changes are pushed to the main branch. New container image tags are picked up by argocd-image-updater (no commits to k8s/deployment.yaml required).

Learn more