Repository navigation
v0.10.0
Installation
{:lowendinsight, "~> v0.10.0"}Docker Image
docker pull ghcr.io/kitplummer/lowendinsight:v0.10.0What's Changed
- feat: auth UI + agentic contribution detection by @kitplummer in #34
- fix(ci): upgrade hex_publish workflow to Elixir 1.16.3 by @kitplummer in #35
- fix(ci): trigger hex_publish on version tags only by @kitplummer in #36
- Wire auth UI routes into deployed endpoint by @kitplummer in #38
- feat: payment-gated signup, ACP agent commerce, and key recovery by @kitplummer in #39
- feat: add /v1/health endpoint returning version and uptime by @kitplummer in #41
- feat: add sliding-window rate limiter to POST /v1/analyze by @kitplummer in #44
- feat(agentic): rename agentic_risk to agentic_classification (ADR-001 WI-1) by @kitplummer in #50
- feat(agentic): update classification thresholds (ADR-001 WI-2) by @kitplummer in #51
- feat(agentic): add restricted_contributors signal via GitHub API (ADR-001 WI-3) by @kitplummer in #52
- feat(admin): add /admin dashboard for cache visibility and usage monitoring by @kitplummer in #54
- fix(gh_trending): restore /gh_trending/:language route by @kitplummer in #55
- feat(docs): update UI and API docs for agentic_classification (ADR-001) by @kitplummer in #56
- feat(agentic): deprecate risk-oriented env vars, add LEI_AGENTIC_*_THRESHOLD by @kitplummer in #57
- fix(trending): replace dead trending API with OSS Insight + GitHub Search by @kitplummer in #59
- test(trending): add integration tests for trending APIs by @kitplummer in #60
- fix(acp): forward /acp/* with the prefix stripped so routes dispatch by @kitplummer in #62
- fix(routing): Stage 0 — make health, readiness, metrics and org routes reachable by @kitplummer in #69
- fix(redis): degrade gracefully when Redis is down, and surface it on /readyz by @kitplummer in #70
- fix(test): check out the Ecto sandbox in RedisResilienceTest by @kitplummer in #71
- fix(redis): connect over IPv6 on Fly's private network by @kitplummer in #72
- docs: add production readiness plan by @kitplummer in #63
- docs: update production readiness plan with execution results by @kitplummer in #73
- feat(deploy): run migrations on release and gate deploys on production smoke by @kitplummer in #74
- fix(deploy): wait for the rolled-back version before verifying it by @kitplummer in #75
- feat(monitor): verify production continuously, not just at deploy time by @kitplummer in #76
- feat(backup): daily encrypted logical dump to an off-platform artifact by @kitplummer in #77
- fix(backup): use a database-scoped Fly token for the proxy by @kitplummer in #78
- fix(backup): put the PostgreSQL 17 client ahead of the runner's 16.x by @kitplummer in #79
- docs(ops): document the complete backup user grant set by @kitplummer in #80
- fix(config): require DATABASE_URL in production, document both listeners by @kitplummer in #81
- docs(ops): add a Redis runbook by @kitplummer in #82
- feat(backup): round-trip verify the encrypted artifact on every run by @kitplummer in #83
- feat(scripts): add verify-backup-artifact.sh for the manual key check by @kitplummer in #84
- fix(billing): point customer-facing URLs at lowendinsight.dev by @kitplummer in #85
- docs: add Stripe billing setup guide derived from the code by @kitplummer in #86
- fix(admin): make /admin reachable, and harden its token check by @kitplummer in #87
- feat(billing): report usage via Stripe Billing Meters by @kitplummer in #88
- fix(security): stop signup handing out admin keys to existing orgs by @kitplummer in #89
- fix(signup): fetch the session before reading it on /signup/success by @kitplummer in #90
- fix(rate-limit): create the ETS table at boot, not in Plug init/1 by @kitplummer in #91
- fix(deploy): drop an unpredictable smoke assertion, narrow rollback checks by @kitplummer in #92
- docs(billing): record the verified sandbox results by @kitplummer in #93
- feat(ci): verify that guard tests actually catch their bugs by @kitplummer in #94
- feat(acp): rate limit the unauthenticated ACP endpoints by @kitplummer in #95
- fix(billing): write usage locally before reporting it to Stripe by @kitplummer in #96
- fix(test): stop rate_limiter_test destroying shared config by @kitplummer in #99
- docs(billing): confirm the meter totals against Stripe directly by @kitplummer in #97
- docs(adr): propose a credit ledger with multiple payment rails by @kitplummer in #98
- fix(test): restore application env on exit, not at end of body by @kitplummer in #107
- feat(credits): append-only credit ledger (ADR-002 stage A) by @kitplummer in #106
- ci: stop retrying the library suite, sweep seeds instead by @kitplummer in #108
- docs(ops): backup grants need FOR ROLE, and a check for missing tables by @kitplummer in #109
- ci: verify the backup role can dump what migrations create by @kitplummer in #110
- feat(billing): surface Stripe webhook verification failures by @kitplummer in #111
- chore: make the definition of done executable by @kitplummer in #114
- fix(ci): refuse to report success when the mutation manifest is unreadable by @kitplummer in #113
- feat(credits): debit the ledger when an analysis is recorded by @kitplummer in #112
- fix: detect binary files without shelling out to grep by @kitplummer in #117
- feat(wallets): an org per wallet, with no free allowance by @kitplummer in #115
- feat(web): credit (r)evolve as operator, GTRI as origin by @kitplummer in #119
- feat(credits): reconcile the ledger against recorded usage by @kitplummer in #120
- fix(credits): the reconciliation boundary is the first debit, not the migration by @kitplummer in #122
- feat(billing): record whether metered usage reached Stripe by @kitplummer in #121
- feat(ci): canary the web UI's actual journeys on every deploy by @kitplummer in #123
- fix(web): the Try it form never submitted by @kitplummer in #124
- feat(web): add the LEI bus favicon by @kitplummer in #128
- feat(web): dark mode by @kitplummer in #129
- fix(web): theme and favicon the pages the glob missed by @kitplummer in #130
- docs(adr-002): amend for MPP, and make rails pluggable on two sides by @kitplummer in #116
- feat(payments): MPP rail — 402 challenge, verify, credit by @kitplummer in #131
- fix(payments): configure the MPP rail so the boot check checks something by @kitplummer in #132
- feat(stripe): derive test/live mode from the key and refuse a half-flip (#137) by @kitplummer in #142
- fix(payments): MPP card rail works against real Stripe (#143) by @kitplummer in #145
- feat(payments): stablecoin over MPP via Tempo and Stripe deposit addresses (#144) by @kitplummer in #146
- feat(payments): an agent with nothing can pay with stablecoin and be served (#147) by @kitplummer in #148
- fix(smoke): an unauthenticated analysis is a 402 now, not a 401 (#147) by @kitplummer in #150
- fix(privacy): don't link what was analysed to the wallet that paid (#149) by @kitplummer in #151
- feat(homepage): tell agents how to pay, what is kept, and why no account by @kitplummer in #153
- fix(billing): close the unbilled analysis paths (#152) by @kitplummer in #155
- fix(trending): refresh one language at a time, publish only complete reports (#158) by @kitplummer in #160
- ops(trending): keep the trending job disabled until repository memory is bounded (#158) by @kitplummer in #161
- fix(analysis): stop loading a repository's history character by character (#158) by @kitplummer in #162
- fix(trending): pick rising repositories, cap their size, and keep the lock short (#158) by @kitplummer in #163
- ops(trending): re-enable the trending job (#158) by @kitplummer in #164
- ops(monitor): don't fail on trending reports that a run is still producing by @kitplummer in #165
- security: analysis reports no longer publish the application config by @kitplummer in #166
- security: read the session and Lei.Auth JWT secrets at boot, and require them in production by @kitplummer in #167
- security: decide auth on the path the router matches, not the raw request path by @kitplummer in #168
- security: org key routes check the caller owns the org; cache scope no longer implied by admin by @kitplummer in #169
- security: Pro activation requires a paid Checkout Session confirmed with Stripe by @kitplummer in #170
- security: a free org's allowance bounds each request, and batches are priced before admission by @kitplummer in #171
- security: agent checkout sells credits on a prepaid org; no free or Pro SKU by @kitplummer in #172
- security: dashboard manages only the signed-in org's keys; templates escape output; sessions bound to a live key by @kitplummer in #173
- security: report pages render repository data as data; trending view button fixed by @kitplummer in #174
- security: the service analyses only public https URLs by @kitplummer in #175
- security: admission checks and charges under a lock on the org by @kitplummer in #176
- docs: security policy by @kitplummer in #178
- ops(canary): fail when a public page or report contains secret-shaped content by @kitplummer in #181
- security: Stripe webhooks are applied once, only when recent, and only when paid by @kitplummer in #182
- security: a job's id is the credential for it, and polling cannot loop analysis by @kitplummer in #183
- security: only an operator can force a trending refresh by @kitplummer in #184
- ui: report detail page; trending "view" opens it by @kitplummer in #185
- refactor: move the hosted service out of the lowendinsight library (ADR-003) by @kitplummer in #186
- refactor: rename the service app lowendinsight_get -> lei_service (ADR-003) by @kitplummer in #187
- refactor: the service's settings live under :lei_service, not :lowendinsight (ADR-003) by @kitplummer in #188
- ci: prove the library stands alone outside the umbrella (ADR-003) by @kitplummer in #189
- build: Elixir 1.20.4 / OTP 28.5 and dependency advisories by @kitplummer in #190
- deps: httpoison 3 / hackney 4; replace httpoison_retry (0.10.0) by @kitplummer in #191
- fix(npm): look packages up in registry.npmjs.org by @kitplummer in #192
- deps: yarn_parser 0.4 and in-range bumps; mix_audit in the audit by @kitplummer in #193
- deps: oban 2.24.1, schema v14, Lifeline and Pruner in production by @kitplummer in #194
- docs(adr): ADR-004 background work runs as Oban jobs (proposed) by @kitplummer in #195
- feat(queue): report stuck and backed-up background work (ADR-004 step 2) by @kitplummer in #196
- feat(jobs): bound every analysis, and drain on deploy (ADR-004 step 3) by @kitplummer in #197
- feat(batch): queue the analyses a batch request pays for (ADR-004 step 4) by @kitplummer in #198
- refactor(usage): remove the fire-and-forget billing path (ADR-004 step 5) by @kitplummer in #199
- feat(scheduling): trending and cache cleaning are Oban jobs (ADR-004 step 6) by @kitplummer in #200
- fix(auth): check operator token expiry, and rate limit the account routes by @kitplummer in #201
- chore(release): 0.10.0 — version bump and changelog by @kitplummer in #202
Full Changelog: v0.9.1...v0.10.0