dropthejase/louis

Full AWS replatform of the mike legal-AI codebase: Bedrock, Aurora, Cognito, AgentCore Strands agents, Vite frontend

High activity across infrastructure, agent, and frontend layers. The most significant changesets are the Aurora migration (41 commits), the Cognito auth migration (25 commits), and the Bedrock LLM replacement. Ongoing bug-fix work focuses on Aurora Data API jsonb string parsing and UUID type cast issues that surface after the initial migration. Recent additions include MCP server support and the tabular agent. The fork is actively maintained with documented gaps.

View on GitHub →

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

Direction

infrastructuresecuritybranding

Activity

Themed changes and pull requests touching this fork, newest first. Themed changes that haven't been turned into a public post yet still appear — they're real work even without a published writeup.

📝 File-level/function-level JSDoc plus inline logging across the API Lambda 2 commits 2mo ago minor change
📝 dropthejase makes Louis think out loud 17 commits 2mo ago chat-ui draft
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.
📝 dropthejase teaches Louis to look up the live law 4 commits 2mo ago searchintegration draft
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.
Show 11 more
📝 Gitignore additions for local AI tooling and demo assets 4 commits 2mo ago minor change
📝 AgentCore deployment migration: container/ECR/Finch → ZIP 8 commits 2mo ago minor change
📝 dropthejase stops chat from losing the thread 3 commits 2mo ago chat-uiinfrastructure draft
A cluster of production fixes that stop conversations from resetting, history from going missing, and one project's chat from bleeding into another.
📝 Repo restructure: backend/ → infra/lambda/{api,conversion} 3 commits 2mo ago minor change

Threads of work (detailed view)

49 threads have been distilled into posts.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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 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.

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.

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.

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.