Better stories for the work behind the screens.

Artifact helps you organize notes, screenshots, decisions, and outcomes into structured case study copy you can edit, copy, and publish anywhere.

Try Artifact now

Overview

Giving visibility to the story behind the work.

Bring together project notes, research, decisions, and visuals, then turn them into a clearer narrative around process, impact, and outcomes.

Artifact is a live web app I designed and built to help designers turn scattered project notes into clearer case studies. I used HTML, CSS, JavaScript, Node.js, Vercel, and the Google AI API to create the full experience from the interface to the generation flow.

Role Designer & developer
Stack Vanilla JS, Node, Vercel
AI Google AI API
Status Live & free to use
Deeper process Architecture, reliability decisions, implementation details, and collaboration.

Architecture

Keeping the build simple.

I worked with Claude Code and built the frontend with HTML, CSS, and JavaScript. The backend runs on Vercel and connects to the Google AI API whenever a user generates a case study from their uploads.

Rather than one function doing everything, the backend is split into four, each responsible for a single job. Clicking Generate calls the first; clicking Strengthen on a single section calls the second. The score bars fill in from the third while you read, and the thumbs up or down at the top of a draft goes to the fourth.

EndpointJobRate limit
/api/generateTurns raw notes and screenshots into a structured draft25/min
/api/strengthenRewrites one section against a coaching goal specific to that section30/min
/api/scoreGrades the draft on impact, decisions, process and role30/min
/api/feedbackLogs a thumbs up or down to a Discord webhook10/min

The rate limits are per minute, per visitor, and they aren't the same number by accident. Generation is the most expensive request, so it's held tightest. Feedback is capped hardest of all because it posts to an external service, which makes it the easiest thing to abuse. I thought about what happens when a free public AI tool meets the open internet. I anticipated abuse and put a ceiling on it before launch.

The four writing formats are designed for different needs rather than returning the same content under different names. Portfolio Skim keeps the story brief, while Deep Dive creates a fuller narrative with more space for process, decisions, and impact.

Reliability

Making AI feel dependable.

AI tools can fail for reasons users never see, including model changes, rate limits, and temporary outages. I built the generation flow to handle those issues gracefully and return clear feedback instead of leaving people stuck on a loading screen, wondering what's happening.

Designed for failure

When the API cannot complete a request, Artifact stops the loading state, keeps the user's work in place, and shows a clear message so they can try again.

What I learned

The code breaking

Shortly after I set it all up, Artifact suddenly stopped generating case studies. The interface only showed a simple error message by design, so the answer was in the Vercel logs. Working through them in a session with Claude Code, we found two unrelated failures stacked on top of each other.

  • The response limit was too high. Each generation was requesting more content than the free tier allows in a single request, so we lowered it.
  • The model I was using had changed. Google had retired it for newly created API keys — the key was not the problem, the model just didn't exist anymore.

The first attempted fix was to check which Google models the key could use and pick from that list. That didn't work because Google still lists retired models and only refuses them at call time.

The biggest lesson was not to assume an external service will always behave the same way. Test the full flow, handle failure clearly, and make the integration easy to update when a provider changes something without a clear warning.

Test what actually works

The system now checks whether a model can complete a real request before relying on it, instead of trusting a list. That made Artifact resilient to the next retirement, and gave me a clearer way to diagnose similar issues in future.

Safeguards

Protecting user input.

Artifact accepts text and images from users, sends that information to an AI model, and displays the result back in the browser. That's a direct path to injected code if handled carelessly, so I treated security as a launch blocker rather than a later cleanup. These safeguards were built out in the same session with Claude Code, covering what the app accepts, how output is displayed, and how often the API can be called.

ControlWhat it stops
Server-side API callsKeeps the Google AI API connection outside the browser.
Output escapingDisplays generated text safely instead of allowing it to run as code.
Rate limitsPrevents repeated requests from overwhelming the public tool.
Input limitsControls the amount of text and the number and size of uploaded images.
Browser security rulesRestricts which scripts, styles, and external resources the page can load.

Making those rules strict meant moving every inline script and style into its own file — including the PDF export, which had been writing a stylesheet directly into a new window. The trade-off was worth it: the policy is now restrictive enough to be meaningful rather than decorative.

Prompt design

Teaching it to say "I don't know".

A tool like this becomes unhelpful the moment it starts inventing details. I wrote the prompt to use only the information the user provides and to flag missing details instead of making up metrics, research findings, or outcomes.

api/generate.js — storytelling rulesPrompt
BEFORE WRITING — silently scan the notes and identify:
• Every specific number, metric, percentage, or time measurement mentioned
• Every design decision described and what alternatives existed
• What was tried and didn't work

THEN WRITE using only what you found above. Rules:
• If a detail isn't in the notes, write [add: metric] — never invent facts
• Active voice: "I ran 8 interviews" not "8 interviews were conducted"
• Cut: leverage, utilize, robust, seamless, innovative, impactful

The Google AI API returns the response in a structured format so each section can be placed correctly in the interface. Artifact then reviews the draft across impact, decisions, process, and role, giving users a clearer idea of what is strong and what still needs work.

Shipping

From local project to live product.

I deployed Artifact on Vercel and used its serverless functions to run the AI features. Vercel logs helped me understand what was happening when requests failed, while separate environment settings made it easier to manage the app across development and production.

  • Clear logs. Each failed request records enough detail for me to find the cause without exposing technical messages to users.
  • Simple error states. Users see a clear message and can try again instead of being shown raw API errors.
  • Safer releases. Vercel keeps previous deployments available, making it easier to roll back changes if something breaks.
  • Controlled usage. Input limits and rate limits help keep the free public tool available without unexpected API usage.

Catching a mismatch before release

Testing an update against the deployed API surfaced a mismatch: the model options in the interface no longer matched what the backend accepted, so every generation would have failed the moment it shipped. Catching it before release rather than after reinforced the value of testing the full flow instead of reviewing the frontend and API separately.

How I worked

Who did what.

I built the first version of Artifact myself — the interface, the prompt design, the four writing formats, and the generation flow behind them.

The work described in What I learned and Safeguards was done in a pair-programming session with Claude Code: migrating to Google's Gemini API, hardening the security, writing the test suite, and debugging the outage above.

I directed that session.

Next

What I'd build next.

  • Saved accounts and drafts. Users could return to previous case studies and continue editing across devices.
  • Faster feedback. Streaming each section as it is generated would make the experience feel more responsive.
  • More guided editing. Stronger suggestions could help users improve weak sections without rewriting the entire case study.