Milo Kang
Hopfinder
Bisque
BiLumix
JK Dental Group
Redact Secret
Redact Secret Benchmarks
Elevated Circle
Hi there...
Skills
Experience
Hopfinder
Problem
Craft beer drinkers want to find breweries near home or on a trip, save the ones they like, and hear about can and bottle releases.
Architecture
- Client — React with Redux. The map and brewery markers come from the Google Maps API.
- API — Express on Node.js, with Sequelize models on PostgreSQL.
- Brewery data — pulled from BreweryDB.
- Auth — Passport with OAuth sign-in; the API issues JWTs.
Notes
Also experimented with third-party APIs to pull each brewery's social media feed into its page.
Bisque
Problem
The Pomodoro Technique splits work into timed blocks with short breaks. Bisque brings that to the browser, and also shows how distracted the time in between really was.
Architecture
- Extension UI — React with Redux, running as a Chrome extension.
- Data and sign-in — Firebase, with OAuth for user authentication.
- Tracking — a timer and a keystroke logger record activity during each block.
- Charts — D3 for the browsing and distraction views.
My part
UI/UX design, user authentication, and the core timer and keystroke logger.
BiLumix
What it is
A headless Shopify storefront for BiLumix. Shopify keeps products, inventory and checkout; the site is a separate client that reads from it.
Architecture
- Client — React and Next.js.
- State — Zustand stores.
- Commerce — the Shopify GraphQL API for catalog and cart.
- Hosting — static files on S3 behind CloudFront.
- Deploy — an AWS SAM template, run from GitHub Actions.
Product media
The 3D animations and still renders are made in Blender from the CAD models of the headlamps, then compressed for the web.
Images
JK Dental Group
What it is
A headless Shopify storefront for JK Dental Group, built as the same client app as BiLumix for a second brand and a wider catalog.
Architecture
- Client — React and Next.js.
- State — Zustand stores.
- Commerce — the Shopify GraphQL API for catalog and cart.
- Hosting — static files on S3 behind CloudFront.
- Deploy — an AWS SAM template, run from GitHub Actions.
Catalog
Headlamps and loupes, dust collectors, and digital, surgical and regenerative products, each as its own collection.
Images
Redact Secret
Problem
A credential pasted into a prompt can end up in a tool response, a trace, a log and a conversation history. Repository scanners look at committed code; this looks at text while the application is still holding it.
input API_KEY=SYNTHETIC_REVOKED_CONTEXT_VALUE
output API_KEY=<SECRET_1>
Architecture
- One core — detection, overlap resolution, policy and redaction happen in a single Rust core.
- Four surfaces — JavaScript, Python, Rust and the CLI all call that core. Each gets a thin translation layer and no copy of the rules, so they cannot disagree about what a secret is.
- Adapters — separate packages carry text from the host to the core: Pino, OpenTelemetry traces and logs, Python logging, AI context and MCP. They decide nothing and fail closed.
- Vault — optional, for values that must be restored later. The core discards the original.
Boundaries
Dependencies run one way: the vault may use the core's public API, and the core and adapters never depend on the vault. Installing the scanner therefore never creates a recoverable copy of a secret.
Images
Redact Secret Benchmarks
Question
How accurately and how efficiently does Redact Secret find credentials and personal data in text? The site answers with recorded measurements and nothing else.
Method
- Answers first — every input is synthetic, and its expected redactions are written before any scanner runs.
- Byte for byte — a result is compared with the expected byte ranges, so a redaction that is one character off is visible.
- Reference tools — other libraries run on the same inputs in the same run. They are listed, never scored against each other.
- Time depends on the text — performance is shown per text on one shared scale, each time next to what the call actually hid.
Site
- Client — Next.js and TypeScript, exported as static files.
- Evidence — numbers on a page link to the rows behind them.
- Hosting — S3 behind CloudFront.
Images
Elevated Circle
What it is
The website of Elevated Circle, a New York company that supplies, maintains and repairs commercial coffee equipment and trains baristas.
Architecture
- Client — React and Next.js, served as static files from S3 behind CloudFront.
- Enquiries — the consult, quote and repair forms post to API Gateway, which invokes an AWS Lambda function.
- Back office — the function talks to a private Jira Cloud app, so each enquiry becomes an issue in a Jira project.
Sections
One page with four expandable sections (equipment, maintenance, repair service, training), each ending in its own enquiry action.





























