/* Cover scale */ .notion-page-cover, .notion-header__cover { background-size: cover !important; background-position: center center !important; } :root { --gs-bg: #080808; --gs-surface: #0e0e0c; --gs-surface-2: #131310; --gs-accent: #C9A96E; --gs-text: #E8E4DA; --gs-muted: #5a5548; --gs-border: rgba(201, 169, 98, 0.16); --gs-font: "Comic Sans MS", "Comic Sans", cursive; --color-bg-default: #080808 !important; --color-text-default: #E8E4DA !important; } *, *::before, *::after { font-family: var(--gs-font) !important; } html, body, .super-root, .super-content { background: var(--gs-bg) !important; color: var(--gs-text) !important; font-family: var(--gs-font) !important; } body::before { content: ""; position: fixed; inset: 0; pointer-events: none; background-image: radial-gradient(circle, rgba(201, 169, 110, 0.22) 1px, transparent 1px); background-size: 32px 32px; opacity: 0.35; z-index: 0; } .super-content, .notion-frame, .notion-page-content { position: relative; z-index: 1; } .notion-page-title-text, .notion-heading, .notion-text, .notion-callout-text, .notion-page-content-inner, .notion-h, h1, h2, h3, h4, h5, h6, p, li, span, a, button, input, textarea, label { color: var(--gs-text) !important; font-family: var(--gs-font) !important; } .notion-divider { border-color: var(--gs-border) !important; } a, .notion-link { color: var(--gs-accent) !important; } .notion-collection_view-block, .notion-collection-item, .notion-callout { background: var(--gs-surface) !important; border: 1px solid var(--gs-border) !important; border-radius: 6px !important; } .super-navbar, .notion-navbar { background: rgba(8, 8, 8, 0.92) !important; border-bottom: 1px solid var(--gs-border) !important; backdrop-filter: blur(8px); } .notion-navbar a, .notion-navbar button, .notion-navbar div { color: var(--gs-text) !important; font-family: var(--gs-font) !important; }
⚙️

GhostStack — Case Study

Problem

Ad-hoc call notes are hard to convert into consistent end-of-day updates without manual cleanup and formatting overhead.

Approach

  • Designed a serverless stack focused on transforming raw notes into structured reports.
  • Used Cloudflare Workers patterns and lightweight API-first service design.
  • Framed the product as an applied AI workflow rather than a generic note tool.

Architecture snapshot

⚙️

Edge runtime: Cloudflare Workers

Workflow: Notes ingest -> transform -> summary output

Product lens: Operator-first reporting workflow

Outcome

  • Live product narrative on Base Layer Labs with clear production use-case positioning.
  • Strong bridge between product engineering and applied data/AI workflows.
  • Fast iteration cycle with low operational overhead.

Artifacts and proof

Demo video

🎬

Loom walkthrough (~90s): Record using the script in the portfolio repo (docs/LOOM-GHOSTSTACK-SCRIPT.md), then paste the Loom share URL on the line below — Notion will embed the player automatically.

// Workflow contract pattern used in the project
type DailyReportInput = {
  accountName: string;
  callNotes: string;
  dateISO: string;
};

What I learned

  • Product clarity improves when user workflow language is explicit in the interface and copy.
  • Operational simplicity matters as much as model sophistication.
  • Serverless architecture keeps iteration cycles fast for solo teams.