dropthejase/louis
Full AWS replatform of the mike legal-AI codebase: Bedrock, Aurora, Cognito, AgentCore Strands agents, Vite frontend
dropthejase/louis is one of the most heavily modified forks in the catalog. The fork starts from willchen96/mike and systematically replaces every third-party dependency with AWS-native equivalents: Supabase auth becomes Cognito User Pool + Amplify, Supabase Postgres becomes Aurora Serverless v2 via RDS Data API, Cloudflare R2 becomes S3, multi-provider LLM routing becomes Bedrock Converse API exclusively, and the original backend is repackaged as a Lambda container (then migrated again to ZIP). The frontend is rewritten from Next.js to Vite + React Router.
On top of the infrastructure replatform, dropthejase adds a two-agent AgentCore architecture: louisMain for general document chat and louisTabular for tabular review, both using Strands SDK with extended thinking enabled. Features added beyond upstream include Strands Skills (user-uploaded knowledge packages), a browse_web tool with an S3-hot-editable allowlist, per-user monthly token quotas via DynamoDB, and MCP server support with Secrets Manager-backed Bearer auth.
The fork maintains a FEATURE-PARITY.md and ORIGINAL-FUNCTIONALITY.md tracking which upstream features are done, in-progress, or explicitly dropped. Known incomplete items at the time of the last tracked commit: credit enforcement UI (tracking works, 429 gate exists, but the modal was removed), edit card status not re-hydrated on chat history reload, and a cross-paragraph deletion limitation in the edit tool.
The CDK stacks are: StorageStack, DatabaseStack, AuthStack, AgentStack, ApiStack, ConversionStack. Each is independently deployable. Finch is required as the container build tool; Docker Desktop is explicitly blocked.
What's in it
- Rebranded as Louis A thorough rename of Mike to Louis, complete with Suits-flavoured loading messages for fans of the show.
- AWS-native rebuild Backend on Lambda, database on Aurora Serverless v2, auth on Cognito with optional MFA, and a dedicated worker for Word/PDF conversion.
- Bedrock-only AI Every model call routes through Amazon Bedrock; other AI providers have been removed entirely.
- Agent runtime with reusable skills Built on Bedrock AgentCore, with markdown 'skill' files users upload once and the agent draws on every turn.
- Two assistants, one product A general chat assistant plus a second one purpose-built for spreadsheet-style document review, each with its own toolkit.
- External tools, safely wired MCP server support with credentials kept in a secrets store, plus a web-browse tool restricted to an editable domain allowlist.
- Per-user monthly credits Usage is metered per person and capped each month, with the user's tier shown in the UI.
- Sharing and direct downloads Project and tabular-review sharing is live, and documents are delivered through short-lived URLs straight from storage.
Direction
infrastructuresecuritybranding
Activity
Show 11 more
Threads of work (detailed view)
dropthejase lets you hand Mike your own playbooks
Users can now upload reference packs the agent pulls in only when a task actually calls for them.
Strands Skills support added to main agent with per-user S3 storage and upload UI
dropthejase adds Skills - user-uploaded markdown knowledge packages stored in S3 per user - to the main AgentCore agent. The agent downloads them to `/tmp` at session start and can read them on demand via a `read_local_file` tool. The storage format and upload validation are reusable independent of Strands.
dropthejase rebuilds Mike to run end-to-end on AWS
A full re-platforming of the fork onto Amazon's serverless stack, with a parity checklist that now reads "all features migrated."
Migration docs: FEATURE-PARITY.md and ORIGINAL-FUNCTIONALITY.md added alongside ARCHITECTURE.md rewrites
dropthejase wrote two structured trackers - FEATURE-PARITY.md and ORIGINAL-FUNCTIONALITY.md - that map every upstream route and call out what was preserved, replaced, dropped, or skipped in the AWS migration. If you are deciding what to import from this fork, those two files are the fastest due-diligence path available.
dropthejase reroutes document uploads straight to storage
Files now go from the browser directly into cloud storage, instead of being pushed through the server in the middle.
Document upload moved to backend-issued presigned PUT URLs; Cognito Identity Pool removed
dropthejase replaced multipart upload through the Lambda with a three-step prepare/upload/register flow using presigned S3 PUT URLs generated by the backend. The browser uploads directly to S3 with no AWS credentials. Once that was in place, the Cognito Identity Pool had no remaining purpose and was removed entirely.
dropthejase turns sharing back on - and fixes the part that was quietly broken
Sharing projects and tabular reviews with a colleague now actually grants them access, instead of failing in silence.
Project and tabular review sharing UI enabled; Aurora jsonb parse fix for shared_with
dropthejase enables the sharing UI for projects and tabular reviews after a brief "Coming soon" hold, and fixes a backend bug where the Aurora Data API returns `shared_with` jsonb columns as raw strings instead of arrays. If you're using Aurora Data API, the same parse-on-read fix will hit you in the same place.
dropthejase rips out the login system and rebuilds it on AWS Cognito
A 25-commit overhaul moves the entire sign-in and account layer from one identity provider to another, with two-factor authentication baked in.
Supabase auth replaced end-to-end with Cognito User Pool, Identity Pool, and Amplify
dropthejase completes a full Supabase-to-Cognito auth migration across 25 commits: CDK stacks, API Gateway authorizer, frontend contexts, signup/login flows, and user deletion. The access-token versus id-token gotcha for AgentCore calls (`95d538d`) is a real footgun worth knowing about before you start.
dropthejase bolts a flight recorder onto the AI
If you're running a Mike-derived agent in production, you can now see exactly what it did on every request - not guess from log lines.
dropthejase puts all of Louis's AI on a single AWS pipeline
The fork rips out bring-your-own-key and bets the whole stack on Amazon's managed AI service.
All LLM calls routed through Bedrock Converse API; Gemini removed
dropthejase replaces the multi-provider LLM layer (Claude via Anthropic SDK + Gemini) with a single Bedrock Converse API adapter. This is the most structural fork divergence: no per-tenant API keys, no provider routing, no Gemini path. The decision collapses a lot of code but is essentially irreversible without reimporting upstream.
dropthejase makes Louis think out loud
A run of streaming-interface work that lets users watch the assistant reason in real time and cleans up the small visual glitches that came with it.
Streaming chat UI hardened: tool card ordering, reasoning blocks, MessageList extraction
dropthejase ships a cluster of streaming chat UI fixes - tool-use accordion appearing mid-sentence, tool cards bleeding across turns, edit cards not collapsing on resolve - plus extended thinking support and a `MessageList` extraction. Most of these are specific to this fork's component shape, but two structural fixes apply to any streaming-tools chat UI.
dropthejase rips out Supabase and moves louis onto Amazon's own database
A full backend swap, not a science experiment - 41 commits move the fork from a hosted Postgres service to AWS Aurora, with everything running inside Amazon's walls.
Supabase Postgres replaced with Aurora Serverless v2 via RDS Data API
dropthejase replaces Supabase with Aurora Serverless v2 across 41 commits, covering every backend route, the CDK stack, trigger Lambdas, and the frontend. The Data API brings specific ergonomic costs - type hints, numbered-param UUID casts, a retry-on-pause wrapper - that the fork has paid down across dozens of follow-up fixes. Adopting the same approach means inheriting the same long tail.
dropthejase opens Louis up to outside tool servers
The fork can now pull in external data and tools on demand - and the first one wired up searches live UK legislation.
MCP server support with Secrets Manager-backed Bearer auth
dropthejase wires MCP server support into the main agent, storing per-server API keys in AWS Secrets Manager rather than env vars. The credential-handling shape - read once at cold start, scoped by server identifier, no plaintext in config - is portable to any fork that wants to connect external tools without leaking secrets.
dropthejase teaches Louis to look up the live law
The Louis assistant can now read current case law, legislation and regulator guidance straight off the web, instead of relying only on what it was trained on or the documents you hand it.
`browse_web` agent tool with S3-backed domain allowlist; AgentCore Browser removed
dropthejase adds a `browse_web` tool to the main agent that fetches legal and regulatory websites using `fetch()` and strips HTML. The domain allowlist lives in S3 so it can be updated without redeploying. AgentCore's managed browser is removed in the same cluster - tried, then abandoned.
dropthejase spends eight commits making louis's assistant keep its promises
A cluster of quiet bugs meant the AI assistant was generating documents, citations, and edits that never properly reached the user - and dropthejase went through and fixed them.
Agent tool hardening: annotation fields corrected, citations resolve real UUIDs, errors surface messages
Eight commits tighten the document-edit tool family: missing DB columns are populated, generate_docx download cards are fixed, citations are rewritten to carry real document UUIDs rather than chat-local labels like "doc-0", and tool errors now return the actual error message rather than a generic string.
dropthejase gives the review grid its own chat assistant
A second AI assistant now sits beside louis's tabular document review - and the feature finally works end to end.
Second `louisTabular` agent deployed; tabular review chat wired to AgentCore
dropthejase adds a purpose-built `louisTabular` AgentCore agent for tabular review chat and works through the resulting bug cluster: jsonb string parsing across multiple routes, Bedrock client singleton fix, UUID cast on the document IN-query, citation schema fixes, and a revert of a retry mechanism that created stale UI. There's also a useful negative result: naive cross-endpoint retry on 500s causes stale state, not safety.
dropthejase builds a document agent that redlines like a lawyer
A from-scratch AI assistant that reads your files, drafts new ones, and edits existing documents as tracked changes you can actually review.
Strands agent with 10 tools built on AgentCore Runtime; JWT userId extraction added
dropthejase built the AI chat core as a TypeScript Strands agent running on AWS AgentCore Runtime - replacing upstream's inline LLM loop with a proper tool-dispatching agent that handles document reads, edits, generation, workflow access, and per-user credits tracking. The tool definitions are largely reusable independent of Strands.
Backend Lambda switches from container image to ZIP via CDK NodejsFunction and esbuild
dropthejase abandoned the ARM64 Lambda container approach and moved to ZIP packaging via CDK's `NodejsFunction`, eliminating a 99-line hand-rolled deploy script and the Docker/Finch requirement for backend deploys. One specific gotcha: `pdfjs-dist` must stay in `nodeModules` because its dynamic `.mjs` import breaks esbuild bundling.
dropthejase turns document conversion from stub to working pipeline
What was a six-line placeholder is now a real service that turns uploaded Word files into PDFs - with the gremlins shaken out.
LibreOffice conversion Lambda wired via EventBridge; infinite-loop guard required for PDF passthrough
dropthejase built a separate x86_64 Lambda container running LibreOffice for DOCX-to-PDF conversion, triggered by EventBridge on docs-bucket uploads. The most operationally important piece: the Lambda must guard against re-triggering itself when it writes the converted PDF back to S3.
dropthejase makes louis fail out loud, not in silence
Three commits give every part of the API proper error handling - so when something breaks, you find out why instead of staring at a hang.
dropthejase teaches Louis to remember the conversation
Chats now survive a page refresh, a closed tab, even a connection dropped mid-answer.
S3SessionManager abandoned; conversation history written manually to S3
dropthejase wired Strands' built-in `S3SessionManager`, then ripped it out after it failed to give the control needed over history reload - specifically, tool activity cards and reasoning blocks were lost on page refresh. The replacement writes `agent.messages` directly to S3 after each invocation and reads them back before the next turn.
dropthejase takes the app server out of the download path
Generated documents now come straight from cloud storage instead of being piped through the application.
Download endpoints return presigned S3 URLs instead of streaming bytes through Lambda
dropthejase converts three download-style routes - `/docx`, `/display`, and `/download` - from streaming file bytes through the API Lambda to returning a short-lived presigned S3 URL. The frontend then fetches directly from S3. Keeps large binary payloads out of the Lambda response path entirely.
dropthejase builds the meter before the gate
This fork now tracks what each user spends on the AI every month - but stops just short of actually capping anyone.
Per-user monthly token quotas tracked in DynamoDB; tier field added to user profiles
dropthejase adds DynamoDB-backed per-user credits, a 429 gate in the API, and a tier field surfaced in the account settings sidebar. The credits modal was added and then removed in the same cluster - the enforcement path existed but the UI was never wired end-to-end.
dropthejase stops chat from losing the thread
A cluster of production fixes that stop conversations from resetting, history from going missing, and one project's chat from bleeding into another.
dropthejase rips out Louis's cloud stack and rebuilds it on AWS
The fork moves its entire backend plumbing - logins, file storage, and the AI connection - off Supabase and Cloudflare and onto Amazon's stack.
dropthejase rips out the frontend's foundation and starts over
Louis swaps its entire web framework for a leaner setup - same product, simpler machinery underneath.
Frontend migrated from Next.js to Vite + React Router in a single large commit
dropthejase replaced the entire Next.js App Router frontend with Vite and React Router v7 in one 135-file commit. The app is SPA-only behind CloudFront, so Next.js was earning very little; Vite builds faster and the S3 deploy is simpler. The cost is a rewrite of every page, every router import, and every layout file.
dropthejase slams the doors on the cloud setup
Two fixes close the open-by-default holes in this fork's cloud infrastructure, so document access is locked to the app itself.
CORS locked to CloudFront domain; Identity Pool server-side token check enabled
Two small hardening commits: CORS on the S3 docs bucket and API Gateway is tightened from `*` to the actual CloudFront distribution domain, and `serverSideTokenCheck` on the Cognito Identity Pool is flipped to `true`. Small changes, but CORS wildcards are the kind of default that survives indefinitely if not addressed explicitly.
dropthejase rebrands Mike as Louis, with a Suits streak
The fork ditches the Mike name for Louis and gives the assistant a personality borrowed straight from the legal drama.
Product renamed Mike → Louis; thinking-phase strings get Suits-character flavour
dropthejase renamed the product to Louis in user-facing text and swapped the thinking-phase placeholder strings for Louis Litt references from the TV show Suits. Internal symbols like `MikeEditAnnotation` and `mikeApi` were left as-is - the rename is surface-level only.
dropthejase pours Mike's AWS foundations from a blank slate
No borrowed infrastructure - dropthejase is building the entire cloud backend for their Mike fork from scratch.
CDK app scaffolded with StorageStack, ApiStack, and ConversionStack; stack split separates concerns
dropthejase built the infra foundation as a CDK app with a stage helper and three independently deployable stacks. The stack split is the most reusable design decision here - each stack owns one concern with cross-stack values passed via CDK outputs or constructor props, not direct construct references.
dropthejase moves the Louis backend onto AWS serverless
The fork repackages its entire backend to run on Amazon's pay-as-you-go cloud - and then commits to it fully, dropping the old self-hosted path.
Express backend wrapped in serverless-http to run as an ARM64 Lambda container
dropthejase pulled the Express app into a shared `app.ts` module, added a `lambda.ts` entrypoint that wraps it with `serverless-http` and Lambda Powertools middleware, and built an ARM64 container image. Local dev still runs the Express server directly against Supabase and R2.