asif/CHANGELOG.md
Changelog

How I built this site with AI

Side project · live since 25 Oct 2026 · built with Claude Code and Cursor

Every product manager resume now says AI somewhere, and a line on a resume proves nothing. This page is the build record behind mine: what the AI tools did, what I decided, and the checks that caught their mistakes.

The short version

  1. Claude Code: Wrote the code and the first draft of every page, from my resume, my LinkedIn profile, and my answers to its 8 questions.
  2. Impeccable: Offered 3 design directions, held every screen to a written craft floor, and its review agent sent back 8 fixes before launch.
  3. Cursor: Took the site to production from one written prompt: a private repository, Cloudflare Pages, a deploy on every push, the domain, and HTTPS.
  1. Decided: The brief, one role in the headline, the design direction, Cloudflare over Claude's pick of Vercel, and no chat widget.
  2. Set the rules: Every figure traces to my resume, my LinkedIn profile, or a live page. The deploy agent stops and asks before it touches DNS.
  3. Checked: Every release is a written Cursor prompt, verified on production before I call it done. Version one was built and live in one day.

Why the address is asif.md

Markdown is the format AI agents read and write. Claude Code takes its standing instructions from Markdown files, a Claude skill is a SKILL.md file, and every prompt I hand Cursor is one too. This site runs on those files, so the page is set as CHANGELOG.md and lives at a .md address. The files behind it:

  1. PRODUCT.md: Who visits, what they must decide, and which facts are off limits. Impeccable loads it before every design task.
  2. DESIGN.md: The visual system and its dated rules, written by an agent from the finished build. Every later edit has to follow it.
  3. SKILL.md: Impeccable and my writing standard are both Claude skills: Markdown files of rules and tests the agent must pass.
  4. Prompts: One Markdown prompt per release, from the first deploy to the move to asif.md. Cursor runs it and stops wherever it says to ask me.
  5. DEPLOY.md: What the agent actually did on each release, written by the agent, so the next run starts from fact.

What I gave Claude Code

Files
My resume and my LinkedIn profile, both as PDFs. For version two, the full ReturnKoto? project folder.
Skills
Impeccable, a Claude design skill, and my own anti-slop writing standard, a Claude skill I first wrote for ReturnKoto?.
Links
My Google Calendar booking page and my LinkedIn profile. My email address and a resume link came later, on 26 Oct 2026.

Eight questions before any code

Claude asked in two rounds before it wrote a line. The answers that shaped the site, written as the diff they produced:

  1. Added: One role in the headline. A hiring manager decides in seconds, and three roles read as none.
  2. Added: The AI proof: ReturnKoto?, this site's own build, and my custom Claude skills.
  3. Removed: Left out an AI chat widget. Chatbots on portfolios are common now. A live product I built proves more than a bot that talks about me.
  4. Added: Hosting on Cloudflare Pages. Claude recommended Vercel; I chose Cloudflare, where ReturnKoto? already runs.
  5. Changed: Contact: a booking link and LinkedIn at launch. My email address and a resume link were added on 26 Oct 2026. Still no headshot.
  6. Added: One personal line, filed under Known issues.
  7. Changed: Figures: resume only in version one. In version two I widened it to my LinkedIn profile, which carries more detail than the resume.

Three directions, then Dieter Rams

Impeccable first wrote a product brief from my answers: who visits, what they need to decide, and which facts are off limits. Then, instead of reaching for its favourite look, it offered three visual directions. I picked The Release Log, a career written as a software changelog, over a fund factsheet, which sat too close to a finance candidate, and a standard PM portfolio, which looks like everyone else's.

Midway through the build I asked for Dieter Rams as an influence. His work for Braun is the reference for "less, but better", and a changelog is already a functional document, so the two fit. Each Braun idea became one rule on this page:

  1. Housing: A warm gray background and a lighter panel, like the casing of a Braun radio. No images and no cards.
  2. One key: Book a call is the only orange element on the site, the way a Braun device has one operating key.
  3. Indicators: Colour appears only where it marks a function: the kind of change on each line, and a small light on each filter key when it is on.
  4. Type: Mona Sans and Monaspace Neon, GitHub's own typefaces, because the page borrows its form from GitHub release notes.

How the skills held the work

During the build Impeccable held every screen to a written craft floor: text contrast, keyboard focus, no card grids, no gradient text, no decorative labels above headings. Its detector scanned the source and returned zero findings. Then a separate review agent compared the finished site against the direction it had agreed to. It sent back eight fixes, among them colour on figures that should have been plain ink, a stats strip that read like a template, and arrow keys missing from the filter bar. After those were in, a second pass returned "ship", and a third agent wrote DESIGN.md, the design system file any later edit has to follow.

The copy went through my writing standard. It treats a page like a score that collapses if any single part fails, and every sentence here passed its five tests:

  1. Substance. Strike every sentence with no fact, number, or decision. If more than a third dies, rewrite.

  2. Inflation. Every strong word must be proved by its sentence. "Verified" survives only when someone verified it.

  3. Competitor. If another candidate could paste the sentence unchanged, it is generic. Replace it with something only I can say.

  4. Effort. The writer does the work, not the reader. The point goes in the first line.

  5. Worst element. One wrong number or one banned phrase fails the whole page.

Every figure on the site was then checked against its source, and a search for banned words and dashes came back empty.

From my laptop to production, with Cursor

I wanted the deploy done by an agent too, so Claude Code wrote a prompt for Cursor in eight phases, with rules on top. Tokens stay in one local file that is never printed or committed. The agent must stop and ask me before it changes nameservers, deletes a DNS record, or makes the repository public. Then the Cursor agent ran it:

  1. Check: Clean install, production build, and a check that every page, the sitemap, and the share image exist, plus a search for banned dashes.
  2. GitHub: A private repository created and pushed from the terminal with the GitHub CLI.
  3. Pages: A Cloudflare Pages project, and a first deploy straight from the build folder with Wrangler.
  4. Auto-deploy: A GitHub Actions workflow that builds and deploys on every push to main. The Cloudflare secrets were set without ever being echoed.
  5. Domain: asifmk.com, registered through Cloudflare and attached to Pages. www redirects to the main address, SSL is set to Full, and HTTPS is forced.
  6. Verify: Requests from the terminal confirmed a 200 on every page, 301s from www and plain HTTP, a valid certificate, the security headers, and the share image.
  7. Record: Cursor wrote down what it had actually done in the repository's deploy notes, so the next person, or the next agent, starts from fact.

Version two: my own review

Once it was live I read the site the way a hiring manager would. Claude Code made the changes, and a second Cursor prompt pushed them; the workflow from version one rebuilt and deployed the site with no further setup. What I sent back:

  1. Fixed: Round green plus signs looked like buttons that would expand, and the plus, tilde, and minus signs needed a legend. Each line now says Added, Removed, Fixed, or Changed in words.
  2. Changed: Headline role: Senior Product Manager. AI shows in the work, not in the job title.
  3. Changed: Tools: Claude Code was the only one named. I also use Cursor, Perplexity, and Gemini.
  4. Added: The ReturnKoto? page rewritten from the project's own files: its memory file, design file, build scripts, audits, and git history.
  5. Added: Detail from my LinkedIn profile, so the site says more than the resume a hiring manager already has.

After version two

The site kept shipping in small releases, each one written as a Cursor prompt and checked on production:

  1. Added: Analytics with no cookies: PostHog events for Book a call, resume and email clicks, filter use, and which releases get read.
  2. Added: A scheduled job that reads ReturnKoto?'s public data files, so the figures here never go stale. It keeps the last good set when a check fails.
  3. Added: A Highlights block and job titles in the releases index, both from an Impeccable critique of the home page read as a hiring manager.
  4. Added: An AI toolchain section near the top, keyed to the work where each tool can be checked.
  5. Added: A 404 page that records the broken address, so a stale link on LinkedIn gets found and fixed.
  6. Changed: A move to asif.md. asifmk.com now answers every old link with a permanent redirect to the same page, so resumes already sent still land.

What the checks caught

The tools made mistakes. These reached a draft, and a rule, a review agent, or my own read caught each one:

  1. Writing skill: A draft called ReturnKoto?'s price history weekly. Its return math runs on monthly prices, so the sentence was rewritten before launch.
  2. Critique: A review of the live site, read as a hiring manager, found this page still saying there was no email or resume link after both had gone up.
  3. Screenshots: The home page intro rendered as "tracks38 mutual funds": the HTML minifier had dropped a space. A screenshot check caught it before it shipped.
  4. My read: This page's header printed the ship date twice, as 25 Oct 2026 and 2026.10. The header now names the tools instead.

Stack

Framework
Astro, built to static HTML. No client framework; small scripts for the filter keys and the motion.
Hosting
Cloudflare Pages, deployed by GitHub Actions on every push to main.
Domain
asif.md, with its DNS on Cloudflare. asifmk.com, the first address, redirects each page to its match here.
Data
The ReturnKoto? figures on this site are read from returnkoto.com's public data files by a scheduled GitHub Actions job, which keeps the last good set when a check fails.
Motion
CSS transitions, one small script, and cross-page view transitions. Off for anyone whose device asks for reduced motion.
Type
Mona Sans and Monaspace Neon, self-hosted.
Analytics
PostHog in cookieless mode, plus Cloudflare Web Analytics. Visits, countries, clicks, scroll depth, and which roles get read, with no cookies set.

What this says about how I work

The AI did the typing, the reviewing, and the deploying. I set the constraints, answered the questions, chose between options the tools could not choose for me, and sent the work back when it was not good enough. That is the job of a product manager on a team that builds with AI, and this site is a small, checkable example of it.

  1. Next: Questions about this build? Ask me on a call.Book a callResumea.mojtoba.k@gmail.com

Back to the changelog