While rebuilding natehaskins.com in Cursor, I kept a Trello card open for project notes, credentials references, and status. That worked fine as a manual habit — until I realized the agent could update the card directly if the repo exposed a small, repeatable interface.
Why a card outside the chat
Chat history is ephemeral. A Trello card is a durable surface I can return to days later, share with myself across devices, and treat as the canonical “what is the state of this project?” view.
I did not want Cursor to replace Trello. I wanted Cursor to write to Trello when something worth recording happened: a deploy, a version bump, a visual change worth snapshotting, or a note about what we tried and what worked.
What we added to the repo
The integration is intentionally small: a config file, credentials in .env, and one Node script the agent (or I) can call from the terminal.
trello.config.json holds the card ID, live site URL, repo URL, and the default screenshot target (http://127.0.0.1:5173/ for local dev). .env stores TRELLO_API_KEY and TRELLO_TOKEN from trello.com/app-key. scripts/trello.mjs implements the commands. npm run trello -- <command> is the entry point.
Commands that matter
show reads the configured card. sync rewrites a marked status block in the card description with the current package.json version, git commit, live URL, and timestamp. comment adds a plain note. attach uploads a local image. capture combines screenshot + attach + comment.
Typical usage after a meaningful change: npm run trello -- sync --message "Deployed v1.0.3 — footer version bump". When I want visual proof: npm run trello -- capture --message "Homepage after JRPG nav polish".
Inline screenshots in comments
Trello does not expose a “attach image to this comment” API the way the web UI does when you paste a screenshot. Uploads become card attachments. But Trello will render an image inline in a comment if the comment text includes markdown pointing at the attachment preview URL.
The pattern looks like this: upload the PNG, take the preview URL from the API response, then post a comment ending with . I had an older card comment that did exactly this for a DNS screenshot — once I noticed that, the script could automate it.
Now capture and attach --message both append that markdown automatically. The image shows up inside the comment thread, not just in the attachments sidebar.
Local Puppeteer in the dev container
Screenshots need a headless browser. Puppeteer’s bundled Chromium expects system libraries that a slim Node container may not have. The fix was to install system Chromium in the devcontainer Dockerfile, set PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium, and skip Puppeteer’s own browser download.
npm run capture-verify runs a quick smoke test. With npm run dev running, npm run trello -- capture grabs the local homepage, saves a copy under .screenshots/, uploads it to the card, and posts an inline comment. That last step — local dev server, local browser, remote project memory — is the workflow I was aiming for.
How Cursor fits in
From Cursor’s side, this is just another npm script in the repo. I can ask the agent to “update the Trello card with a note about what we shipped” and it runs the same commands I would. The card becomes shared context that survives beyond any single chat session.
It also keeps the AI out of credentials management in a reasonable way: the tokens live in .env (gitignored), the card ID is in config, and the script fails fast with a clear error if either is missing.
What I would do next
This is enough for day-to-day work: sync on deploy, comment when something interesting happens, capture when the UI changed. Later I might wire sync into a Cloudflare deploy hook, or add a post-commit script — but I wanted the manual path working first so I could see what notes were actually worth keeping.
If you already use Trello for project tracking, giving your agent a narrow, script-shaped way to write there is a low-friction experiment. Start with comments. Add sync when version numbers matter. Add capture when visuals matter. Keep the card ID in config and the secrets out of git.