Releases
v0.4.0
Compare
Sorry, something went wrong.
No results found
0.4.0 (2026-07-30)
⚠ BREAKING CHANGES
repo: authentication can no longer be disabled. Before upgrading, take and verify a PostgreSQL backup. Remove AUTH_ENABLED from every environment file — the API refuses to boot while it is present. Set AUTH_SECRET to at least 32 characters, for example openssl rand -hex 32, in the root .env for Compose and in apps/api/.env for local development. On first start, open the web app and create the owner account; registration closes automatically once it exists. Existing sessions are invalidated and every MCP client needs a personal API token.
web: gate every route behind a session
api: require authentication on every request
shared: replace the auth enabled flag with setup state
Features
alerts: daily flush with grouped payload (b8d156f )
alerts: delivery log with retention (a596afd )
alerts: digest webhook formatting (ed5f2d6 )
alerts: email alert crud and config endpoints (afb2de8 )
alerts: grouped alert delivery (18af508 )
alerts: grouped email template (e2949a4 )
alerts: negative review alerts (eefc253 )
alerts: outbox dispatch mode (8661072 )
alerts: queued email delivery (a268090 )
alerts: queued webhook delivery with hmac signatures (44efb37 )
alerts: rank drop alerts from daily checks (d65cc13 )
alerts: smtp mailer and email formatting (ab396c5 )
alerts: webhook registry with crud endpoints (8c26774 )
analytics: app summary endpoint (cba7a1e )
analytics: blended group visibility (9eec61e )
analytics: portfolio summary endpoint (a8684ea )
analytics: rank distribution history endpoint (616fe57 )
analytics: ratings history endpoint (f42fccb )
analytics: visibility history for charts (a60bb84 )
analytics: visibility score computation (0c5664b )
api: add swagger openapi docs at /docs (d4af179 )
api: app link endpoints (439ee30 )
api: auth module with register and login (adea72b )
api: basic auth for bull board (2c00b84 )
api: entitlement guard and trial (a40e00d )
api: format scoped email notifications (7ec7186 )
api: format scoped webhook notifications (6080216 )
api: global auth guard (a888916 )
api: global validation and consistent error envelope (c2efd1f )
api: google play metadata audit (01271ba )
api: grossing chart scheduling (b6fd935 )
api: openai client provider (20b5c92 )
api: openapi documentation at /docs (27caca1 )
api: password change with session reset (3863021 )
api: personal api tokens (1c96f69 )
api: pipeline signals in health endpoint (bf0faaa )
api: play ratings histogram endpoint (e4a7246 )
api: require authentication on every request (56426d1 )
apps: add list detail and delete endpoints (d2387a8 )
apps: add manual refresh with snapshot diffing (7bcc55b )
apps: import app from store url with initial snapshot (21830f9 )
apps: import honors store url country with override (501a03d )
apps: market availability endpoint (e5b670d )
audit history persistence (1e7b80c )
audit: ai-driven audit from openai (ae16d5f )
audit: app audit endpoint with manual inputs (24e4b17 )
audit: audit history endpoint (51e9d0c )
audit: daily audit score snapshot (c731e14 )
audit: rubric engine with aso-skills factor weights (0966091 )
auth: gate the queue dashboard and openapi surface on an owner session (b92b2de )
auth: login, register, api tokens and entitlements (c1a4723 )
auth: owner only admin surfaces (f4c8937 )
blended cross-store visibility for linked apps (a83c1c5 )
changes: change timeline endpoint (335e4ba )
changes: persist metadata change events on refresh (14c5df6 )
changes: whats new change events (11d19f7 )
changes: workspace recent changes endpoint (f6ad0f6 )
competitors: add and manage competitor apps (2a5bb3a )
competitors: capture competitor positions in daily rank checks (20c26a6 )
competitors: competitor discovery from serp entries (e0869f0 )
competitors: keyword comparison with gap analysis (24ab67a )
competitors: keyword gap and positioning analysis (daa0c5b )
db: add durable alert flush claims (4e89fd8 )
db: alert event outbox (36f491f )
db: app group model (9fd97b1 )
db: audit score model (f89ac3f )
db: category genre key migration (8c3d2b2 )
db: category rank model (4a2d049 )
db: change events and webhooks (c806b19 )
db: email alerts and alert deliveries (47933f8 )
db: keyword relevance override and audit inputs (c571235 )
db: persist scoring provenance (1e6e17d )
db: review model (2ad91fb )
db: serp entry model for daily top search results (923a953 )
db: suggest probe model (fdbe170 )
db: user and api token models (8cdc47c )
docker: one command full stack compose (fa37bd3 )
docker: production images for api and web via turbo prune (72f04df )
jobs: add daily pipeline scheduler with idempotent fan out (3d7a66d )
jobs: add rate limited app store worker (0035ee7 )
jobs: configurable data retention job (8f43948 )
jobs: configure bullmq queues and redis connection (7bc53a7 )
jobs: daily request budget estimate endpoint (e747a53 )
jobs: daily review sync with import backfill (486e9f4 )
jobs: digest group section (1bb666d )
jobs: gplay queue and worker (1e9227f )
jobs: manual pipeline trigger per app (f7090cc )
jobs: mount bull board dashboard behind config flag (956d296 )
jobs: per store daily budget (f186cf9 )
jobs: store routed job enqueueing (fabbdea )
jobs: weekly digest schedule and payload builder (73d97f8 )
keywords: add metadata keyword extraction utility (fdf597f )
keywords: auto track summary keywords for google play (2c35660 )
keywords: auto track title and subtitle keywords on import (48e25ff )
keywords: competitor based keyword suggestions (1bc2caf )
keywords: country-scoped keyword endpoints (65f86dd )
keywords: developer suggestion strategy (7e28d51 )
keywords: expose previous day position on tracked keywords (3ad819e )
keywords: expose scoring provenance (ab8ffe8 )
keywords: expose the captured rank depth (adc3121 )
keywords: manage tracked keywords via crud endpoints (49f7d6f )
keywords: relevance updates and strategic keyword buckets (9e30b48 )
keywords: review mining suggestion strategy (d6d6b97 )
keywords: seasonal keyword calendar suggestions (7e7f93e )
keywords: serp volatility on tracked keywords (c340b25 )
keywords: suggest spider endpoints and probe jobs (799a75e )
keywords: suggestion strategies via metadata autocomplete and similar apps (524d245 )
keywords: support manual ios keyword field input (e54f0a5 )
keywords: track keywords per country under one app (6889f19 )
keywords: volatility sort key (52e84ce )
mcp: drop the disabled auth preflight branch (da46aea )
mcp: ranking audit and insight tools (ce04d06 )
mcp: read-only MCP server for agents (8d62bc1 )
mcp: server scaffold, api client and auth preflight (a3a0a2c )
mcp: tool factory with app and keyword tools (359782d )
metadata: metadata audit with keyword coverage matrix (b6781ac )
metadata: openai draft assistant (dd2c843 )
monitor and portfolio quick wins (86c360a )
openai-driven ai aso audit and metadata assistant (2cd89e7 )
play insights — availability probe, developer strategy, ratings histogram (744eed3 )
providers: app store reviews listing (0cdebc2 )
providers: availability and developer lookups (6ee9263 )
providers: google play lib wrapper (8669b19 )
providers: google play provider implementation (652b228 )
providers: release notes raw fact (d7a1670 )
providers: store aware raw facts (15b7d41 )
providers: top charts listing for the app store (72532ba )
providers: typed raw snapshot facts extraction (8de2a9f )
rankings: capture daily keyword positions from a single search (b2917c0 )
rankings: capture keyword positions to depth 200 (58972d5 )
rankings: category rank history endpoint (7776942 )
rankings: daily category rank capture (aae9233 )
rankings: persist top serp entries during keyword checks (e701aeb )
rankings: ranking history endpoint for charts (ce21865 )
rankings: serp entrant alert event (77d3aa9 )
rankings: serp movers endpoint (90e9968 )
rankings: serp snapshot endpoint (cfa4f27 )
scoring: expose opportunity in keyword listing (4edd6d5 )
scoring: google play formulas (0d85d0f )
scoring: google play stats collection (5a067e2 )
scoring: keyword stats collection with two request budget (b6b20f7 )
scoring: port aso-skills opportunity formula with relevance (117f6eb )
scoring: pure traffic and difficulty formulas with tunable weights (6f7ed4c )
scoring: record metric provenance (f05a9f8 )
scoring: scheduled and on demand keyword scoring (f6c80c5 )
shared: add rank depth constant and position formatter (c0fe7e1 )
shared: alert batch contracts (656b82b )
shared: app group contracts (dffe175 )
shared: app list country and daily budget contracts (6a930be )
shared: aso limits, metadata lint rules and audit contracts (89c098f )
shared: audit history contracts (f45655d )
shared: category genre key contracts (d12ac7b )
shared: category rank contracts and collection union (5df385d )
shared: change timeline and webhook contracts (373501d )
shared: daily position delta and rank distribution history contracts (bd929f3 )
shared: define scoring provenance contracts (39f38e0 )
shared: email alert and delivery log contracts (eb2c5fc )
shared: enable google play imports (d6cd442 )
shared: group visibility contracts (90767de )
shared: keyword country on tracked item and country summary (5318978 )
shared: metadata assistant contracts (28adf3a )
shared: metadata coverage field contracts (83e894b )
shared: per store budget contract (3b4c8eb )
shared: portfolio and weekly digest contracts (4f58dc5 )
shared: replace the auth enabled flag with setup state (3ade0c1 )
shared: review contracts, reviews strategy and negative review event (404dddf )
shared: serp snapshot and competitor discovery contracts (54c6f82 )
shared: serp volatility and movers contracts (a54b826 )
shared: volatility sort entrant event and portfolio contracts (7c2412a )
shared: whats new field, spider and pipeline health contracts (25e429b )
web: add favicon, icon and apple-icon set (60a1573 )
web: add guided app setup checklist (a263772 )
web: add keywords dialog (4bf6dc4 )
web: add web app manifest and pwa icons (0bb7475 )
web: ai audit panel (e7185d4 )
web: alert delivery settings card (a0529a3 )
web: api token settings (a791335 )
web: app detail layout with section navigation (e399a49 )
web: app detail with summary strip and keyword table (0f5cbc4 )
web: app icon set, manifest and theme (4eb8ae8 )
web: app import dialog with validation and toasts (73d07da )
web: app shell with navigation and health indicator (bf2daa4 )
web: apps dashboard with server prefetch (65e40e7 )
web: apps list with store url import form (35f4982 )
web: audit history chart and digest delta (6a45a71 )
web: audit score card on app detail (c87b65c )
web: availability probe developer strategy and histogram (611b682 )
web: base layout and navigation shell (101d38d )
web: blended group visibility row (90bb60e )
web: bulk actions for selected keywords (e8f6ef9 )
web: category genre keys (118f67d )
web: category rank chart on overview (2d102ed )
web: change timeline view (9308d70 )
web: command palette (5b3f8cf )
web: competitor analysis and keyword buckets views (f939c94 )
web: competitor discovery panel (ba37092 )
web: competitor management (c7b2bc0 )
web: core ui primitives via shadcn (8606132 )
web: country aware import and badges (7b5a5f3 )
web: country-scoped keyword queries and url state (5a1c7ec )
web: csv export for keywords and rankings (c635a09 )
web: daily position delta in keywords table (9a16b03 )
web: dark mode with theme toggle (5080864 )
web: dashboard empty and error states (0531405 )
web: degraded state in health badge (7c848af )
web: delete app with confirmation (b7711c3 )
web: email alerts and delivery log in settings (ae9cbdb )
web: full api coverage with query options factories (3359105 )
web: gate every route behind a session (7885c14 )
web: google play import polish (23dc912 )
web: grouped portfolio rows (af9a4e2 )
web: ios keyword field editor (d998de1 )
web: keyword comparison matrix with gap filter (8970bfa )
web: keyword movers and coverage cards (cd7f71d )
web: keyword picker for ranking series (df0ab3a )
web: keyword row actions (cd07be9 )
web: keyword suggestions with one click tracking (2f7b160 )
web: keywords table on tanstack react-table with row selection (7ed49ea )
web: keywords table with url sort state (db9db0a )
web: linked app navigation (6dd6290 )
web: login register and paywall pages (f595934 )
web: mcp server connect card in settings (e29e5bc )
web: metadata assistant panel (b531a40 )
web: metadata workbench with live counters (76282ab )
web: overview stat cards with deltas (485ceb0 )
web: per store budget breakdown (37bbe4b )
web: per-country keyword filter and add flow (4471046 )
web: portfolio dashboard home (06a0751 )
web: proxy cookie forwarding (3702519 )
web: query and url state providers (ae2cbc0 )
web: rank distribution chart (8b47825 )
web: rank distribution history chart (795bb6a )
web: ranking date range presets (677b2fb )
web: ranking history chart with reversed position axis (286640c )
web: recent changes feed on dashboard (63ff636 )
web: refresh and run daily actions with snapshot diff (8331e5e )
web: render positions against the captured depth (32425c4 )
web: request budget card in settings (d21a504 )
web: reviews suggestion tab and alert event surfaces (66ac462 )
web: reviews tab with ratings chart and filters (82df361 )
web: route level loading and error coverage (13ede5a )
web: runtime api proxy route (3c35626 )
web: serp movers card on rankings (08e1496 )
web: serp preview sheet on keyword rows (85af82f )
web: serve the admin surfaces on the app origin (83f6ad8 )
web: set theme color and apple web app metadata (aeef487 )
web: shadcn ui foundation with neutral theme (c7fa3a0 )
web: show brand mark in site header (ee6c0f5 )
web: show pipeline-complete alert delivery (273d034 )
web: show scoring provenance (5f02a1e )
web: start onboarding after first import (15e8ab0 )
web: store aware metadata workbench (d70c846 )
web: storefront grouped portfolio rows (c786f96 )
web: suggest spider dialog (6a6d423 )
web: typed api client with error handling (69db16e )
web: visibility history area chart (f492995 )
web: volatility column in keywords table (da14b9b )
web: webhook settings page (fafab92 )
Bug Fixes
alerts: address split delivery review findings (b84cd1f )
alerts: format webhook payloads for discord and slack (4313dce )
alerts: keep batch events flat and flush before marking sent (f95de97 )
alerts: render batch webhook detail for discord and slack (40c687e )
alerts: render batch webhook detail for discord and slack (037b022 )
alerts: render batched webhook body for discord and slack (1c2d226 )
alerts: scope outbox dedupe by workspace and keep rows consistent (38b3441 )
analytics: align group visibility capture dates (94be6e5 )
analytics: align group visibility capture dates (aebb2a9 )
analytics: drop movers without both compared captures (a7c060c )
analytics: drop the stale zero delta from a single audit snapshot (22561c1 )
analytics: treat a non-positive mover position as unranked (7116af9 )
api: bound the openai client timeout and retries (2178c57 )
api: enable cors for the web frontend (41fb87c )
api: rate-limit token creation, map unique violations to 409, add trust-proxy option (05752ef )
api: reject non-stop openai completions and cover the adapter (c452f91 )
api: serialize bigint values in json responses (9eb2357 )
api: treat blank openai env values as unset (1066a02 )
audit: ground ai factors in evidence and coalesce runs (639a411 )
audit: normalize history bounds to the utc day (054b556 )
audit: score only observable ai factors and reject empty output (a6f1d05 )
auth (3795604 )
docker: web api url (0340787 )
harden availability and histogram edge cases (f87dd33 )
jobs: colon-free custom job ids for bullmq 5 (898356f )
jobs: isolate e2e queue onto a separate redis db (e1322ea )
mcp: name the depth field the keyword payload returns (b16f0b1 )
mcp: reject unentitled accounts and encode path segments (6d48311 )
metadata: market-scope drafts and enforce the field contract (7d624c3 )
providers: scrape ios subtitle from product page (400e8e7 )
rankings: capture keyword rankings regardless of app home country (28efc72 )
rankings: use the same-day snapshot as the entrant baseline (5b84e6a )
repo: address review findings on the quality refactor (e95a632 )
repo: address stabilization review findings (af7a669 )
repo: patch release readiness dependencies (6290c36 )
repo: resolve split alert delivery review findings (77a9e72 )
repo: widen the dependency overrides to security ranges (f6b031c )
scoring: fail scoring when the play prefix sweep breaks (5de8f1a )
scoring: skip scoring gracefully when the keyword is gone (b687631 )
scoring: tolerate suggest failures when collecting keyword stats (d0e0ad9 )
shared: share the metadata assistant request contract (ed646ee )
shared: treat every non-positive rank as unranked (5d1633d )
tests: e2e failing on ci (c1d2d2b )
web: bound proxy upstream, forward client ip, gate protected content, reset auth dialogs (6db20ee )
web: clear command palette search when it reopens (7b3a130 )
web: forward tooltip trigger props through the sort header (16a3dcb )
web: keep settings reachable on small screens (2bfe7e2 )
web: make guided setup opt-in and recoverable (8a1a33f )
web: navigate consistently on every session transition (69c9f42 )
web: render a single api health badge (5236e69 )
web: report metadata draft copy failures (7f379e7 )
web: scope score provenance to measured metrics (25e72d6 )
web: serve groups from the e2e portfolio mock (714450a )
web: show >100 for unranked series in ranking tooltip (5786b7e )
web: surface lint messages and share metadata display maps (cd92725 )
web: sync command palette open ref synchronously (ac0d87a )
web: wrap recent changes list in TooltipProvider (5a6b4fc )
web: wrap recent changes list in TooltipProvider (f5444e5 )
Refactoring
alerts: split durable alert delivery (74f7450 )
analytics: extract shared read helpers (a8ab20f )
analytics: move portfolio roll-up into its own provider (f301004 )
analytics: move weekly digest builder into its own provider (11591f9 )
api: make alert flushes resumable (3a7725c )
api: separate alert batch classification (8e72a73 )
api: split and order alert batch delivery (9582488 )
apps: extract linked-app group logic into its own provider (67b6e0f )
audit: extract shared check scoring primitives (ab2e641 )
auth: track the admin grant in a weakset (6c56c6b )
competitors: move competitor crud out of the apps service (cf8425e )
jobs: flush alerts after daily pipeline completion (5bfb97f )
keywords: confirm keywords service is core crud and compare (8d40dec )
keywords: extract shared keyword helpers (e9608d0 )
keywords: extract spider into its own provider (79663e8 )
keywords: extract suggestion strategies into their own provider (fdd2f9c )
metadata: extract draft prompt building and parsing (5cc9997 )
rankings: extract serp reads into their own provider (80acabe )
rankings: isolate rank alert dispatch (ecae096 )
repo: execute the code-quality plan (q0-q6) (c34d4f9 )
repo: remove dead code and stray imports (778011b )
shared: add job enqueue contracts (dc19dad )
shared: consolidate api contract types (08f614b )
shared: define mutation request contracts in shared (938564a )
shared: require the captured depth on rank payloads (57049cd )
web: drop phase 9 ui primitives (978353f )
web: extract api client core (d2f5b57 )
web: extract keyword csv export (43423e4 )
web: extract keyword table cells (a17135f )
web: extract keyword table columns (48adc78 )
web: frame import country as home storefront (b0fc2b8 )
web: move endpoint functions into domain api modules (ac88f97 )
web: remove legacy components and dead code (f64a281 )
web: responsive and accessibility pass (45b6bb7 )
web: share alert channel card primitives (27c6b6b )
Documentation
add code organization standards (1930d2c )
add phase 11 aso audit plan and new commit scopes (f1f2692 )
authentication setup (3353e73 )
clarify registration toggle and document proxy env vars (737fc55 )
complete alert env reference (751ce85 )
correct ai empty-key behavior and rubric reference (dde51d9 )
describe the split web transport (e28f2b1 )
docker: add backup restore and upgrade runbook (776f247 )
docker: rotate the database password with its env file (b12156c )
frontend guide and updated readme (35ab12a )
google play support (332346e )
grouped alert delivery (13e7cc5 )
mark phase 10 complete (a631873 )
mark phase 11 complete (0b5fbf1 )
mark phase 24 complete (6b7871a )
mark phase 25 complete (870378b )
mark phase 26 complete (32a024f )
mark phase 3 complete (c9cca98 )
mark phase 30 complete (d3eddfe )
mark phase 31 complete (17ca3bf )
mark phase 32 complete (0c1f118 )
mark phase 35 complete (f72816d )
mark phase 36 complete (39c9a3a )
mark phase 38 complete (9ca8f42 )
mark phase 4 complete (d472742 )
mark phase 5 complete (b91685d )
mark phase 6 complete (95cedf5 )
mark phase 7 complete (b328928 )
mark phase 8 complete (4a93d14 )
mark phase 9 complete (50e72e4 )
mark quality phase q0 complete (bffd68a )
mark quality phase q1 complete (8986680 )
mark quality phase q2 complete (7bc10cf )
mark quality phase q3 complete (0ec5400 )
mark quality phase q4 complete (8b8608d )
mark quality phase q5 complete (092637b )
mark quality phase q6 complete (d736ffa )
mcp server usage (df33778 )
multi country tracking notes (01430ea )
multi-country keyword tracking model (d3c46e9 )
openai ai features setup (8a711c0 )
project readme with quick start and configuration reference (1ead791 )
repo: add contribution, security and issue templates (6db5cf0 )
repo: define the road to 1.0 (eae811d )
repo: describe owner-only access to the admin surfaces (cf0b7c0 )
repo: document durable split alert delivery (836ac43 )
repo: document mandatory authentication (ae8a592 )
repo: document the current product (3ea1e01 )
repo: normalize shipped phase history (5c3cd1f )
repo: record how release notes reach the changelog (41aecc5 )
repo: scope the admin gate wording to API_DOCS modes (3a13f94 )
retention settings and runtime api url (f57c5e4 )
vendor aso-skills reference rubrics (48ee96e )
Build and Deployment
docker: harden production compose defaults (9040c60 )
docker: remove build time api url from the web image (64ecf49 )
docker: run application images as non-root (9780515 )
repo: allow identifiers in commit subjects (17d7d8e )
repo: enforce conventional commits with commitlint (a85167b )
repo: format every file type prettier owns on commit (dbfeff5 )
repo: generate prisma client as a turbo prerequisite task (0ee9db4 )
You can’t perform that action at this time.