Skip to content

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 16 Sep 13:40
· 293 commits to main since this release
518fe30

Installation

{:lowendinsight, "~> v0.10.0"}

Docker Image

docker pull ghcr.io/kitplummer/lowendinsight:v0.10.0

What'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