FluxyChat

Audit

FluxyChat Audit remediation tracker

Source audit: [production-due-diligence-2026-06-15.md](/docs/production-due-diligence-2026-06-15)

Source audit: production-due-diligence-2026-06-15.md
Overall score at audit: 47 / 100
Target: close P0 + quick wins before open beta scale-up; schedule 4–8 week debt programme for router/TS/observability.

Status legend: open | in_progress | done | wontfix | deferred


P0 block production (section 14)

IDSummaryStatusNotes / PR
S-1/api/fluxy/mint-member body API key + console fallbackdoneNo body key; tenant Clerk key only; self-host /admin/member-token
S-2canBypassRoomMembership role bypassopenRestrict bot bypass; audit log
S-3Public room access for any memberopenPolicy review
S-4Search snippet XSS (dangerouslySetInnerHTML)donehighlightSearchSnippet()
S-5renderMarkdown XSSdoneEscape + table/blockquote placeholders
S-6Guest session client userId impersonationdoneServer-generated guest IDs only
S-8Stripe webhook without secretdone503 if secret missing
S-9Identity routes CORS *doneUses handler corsHeaders / allowlist
S-7Dashboard no auth when Clerk offdoneAck gate forced in production
S-11SHA-256 API key hashdeferredArgon2/bcrypt migration
S-25 / S-28Plaintext webhook secrets / api_keys.secretopenFail-closed + column deprecation
FTSmessages_fts.rowid join bugopenFunctional fix content table
P-1100+ sequential dispatchersdeferredHono / static router
S-15SSRF string-only checkopenDNS resolution

Quick wins (section 15)

IDSummaryStatus
QW-1Default ALLOWED_ORIGINS not * on hosteddone
QW-2Webhook secret encryption fail-closedopen
QW-3Stripe webhook secret requireddone
QW-4Identity CORS from allowlistdone
QW-5Drop projectApiKey from mint-memberdone
QW-6Guest userId server-generateddone
QW-7PATCH message requires deleted_at IS NULLdone
QW-8Escape search snippetsdone
QW-9Log canBypassRoomMembershipopen
QW-10pnpm audit in CIopen
QW-11Sanitize markdown + snippetsdone
QW-12Fix FTS5 content tableopen
QW-13Batch D1 writes in transactionsopen
QW-14Structured trace samplingopen
QW-15Remove dynamic import() in hot pathsopen

Security HIGH (section 4)

IDSummaryStatus
S-14Self-host DEFAULT_PROJECT_ID fallbackopen
S-15SSRF DNS bypassopen
S-16–S-17WS room id vs DO id mismatchopen
S-18–S-19Rate limit read-modify-writeopen
S-20WS rate limit lost on DO evictionopen
S-21SAML signature verificationopen
S-22presenceInfo unauthenticatedopen
S-23/api/fluxy/* no auth without Clerkin_progress
S-24PII in logsopen
S-26Voice/stub routes exposedopen
S-27Mint project vs Clerk metadatain_progress

Code quality (section 5)

IDSummaryStatus
Q-1–Q-20Router, TS migration, room-do size, stubsdeferred

Performance (section 6)

IDSummaryStatus
P-1–P-13Dispatcher, D1 on connect, webhooks, metricsdeferred

Database (section 7)

IDSummaryStatus
FTS rowidSearch brokenopen
FK gapsNo FK on project_iddeferred
IndexesHot path compositesopen

Infra / DevOps (section 8)

IDSummaryStatus
CI SAST/SBOMNo Semgrep/SBOM in CIopen
Staging before prodManual deployopen
AlertingNo PagerDuty/Slack wiredopen
PR preview envMissingdeferred

Testing (section 10)

IDSummaryStatus
mint-member bypassNo testin_progress
SAML / guest / search XSSNo testin_progress
Dashboard unit coverageSparsedeferred

Bugs non-security (section 13)

IDSummaryStatus
B-1–B-15Stream ops, orphans, idempotencyopen

Long-term (section 16)

Tracked as epics not scheduled in this pass:

  • Hono router + kill deps bag
  • Full worker TS migration
  • httpOnly session cookies
  • Cloudflare Analytics Engine for counters
  • Third-party pentest before GA

Changelog

DateChange
2026-06-15Audit imported; remediation tracker created
2026-06-15P0 batch 1: mint-member, guest ID, Stripe, CORS, XSS, PATCH deleted_at, prod ack gate

On this page