<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CAPTD</title>
    <description>The latest articles on DEV Community by CAPTD (@captd).</description>
    <link>https://dev.to/captd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4099148%2F29b343cf-c5de-4509-854f-1e639e8d4602.jpeg</url>
      <title>DEV Community: CAPTD</title>
      <link>https://dev.to/captd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/captd"/>
    <language>en</language>
    <item>
      <title>This week in CAPTD: sample photos on the homepage, atomic credit charging, and new EXIF and histogram tools</title>
      <dc:creator>CAPTD</dc:creator>
      <pubDate>Tue, 22 Sep 2026 16:22:34 +0000</pubDate>
      <link>https://dev.to/captd/this-week-in-captd-sample-photos-on-the-homepage-atomic-credit-charging-and-new-exif-and-5eej</link>
      <guid>https://dev.to/captd/this-week-in-captd-sample-photos-on-the-homepage-atomic-credit-charging-and-new-exif-and-5eej</guid>
      <description>&lt;p&gt;It has been a busy week of shipping here at CAPTD. We rolled out major workflow upgrades for the Snapshot workspace, launched powerful new browser-based photography tools, and made critical backend fixes to credit reservations and deployment reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Homepage sample generator&lt;/strong&gt;: First-time visitors without a photo to hand can now test out our real AI generator on three built-in example photos directly from the homepage, with no upload or generation credits required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atomic credit charging&lt;/strong&gt;: We switched purchase credit charging from a post-hoc optimistic update to an atomic SQL reservation before AI calls, completely solving lost writes during parallel regenerates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict character limits&lt;/strong&gt;: The Snapshot workspace now enforces each platform's real character limit—including specific emoji counting rules for X and Threads—across the entire pasted post pack to prevent manual overflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New EXIF Viewer tool&lt;/strong&gt;: We added a brand new free, browser-based EXIF viewer tool that reads camera metadata locally in your browser without ever handling or storing location coordinates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgraded Histogram Viewer&lt;/strong&gt;: The free histogram tool got a massive upgrade with interactive Lightroom-style stacked RGB channels, clipping triangles, pixel sampling, and reverse highlight photo overlays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gear guide expansions&lt;/strong&gt;: We deepened gear-guide entries for popular camera bodies like the Nikon Z50 II, Fujifilm X-T5, and X-M5, expanding recommendations from 3 to 8 detailed, genre-specific cards with practical reasoning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment and reliability fixes&lt;/strong&gt;: Overhauled our service worker to stop caching navigation shells, fixed a persistent deployment caching bug causing dynamic import errors for returning users, and resolved a critical bug where dry runs incorrectly mutated production marketing state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FCF-app-code%2Fcaptd-app%2Fmarketing-state%2Fassets%2F2026-W39%2F00-tools-ai-assistant-photo-analysis-histogram-viewer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FCF-app-code%2Fcaptd-app%2Fmarketing-state%2Fassets%2F2026-W39%2F00-tools-ai-assistant-photo-analysis-histogram-viewer.png" alt="CAPTD Histogram Viewer interface showing stacked RGB channels and clipping indicators" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The newly upgraded histogram tool featuring interactive stacked RGB channels and clipping triangles.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth a look
&lt;/h2&gt;

&lt;p&gt;In case you missed it or are new around here, CAPTD is packed with tools designed specifically to help photographers speed up their publishing workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Platform-tailored captions&lt;/strong&gt;: The Snapshot workspace automatically generates distinct, ready-to-publish captions tailored specifically for Instagram, TikTok, and LinkedIn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creator Voice&lt;/strong&gt;: Dial in your preferred tone so your social media captions always sound authentically like you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frictionless start&lt;/strong&gt;: You can dive straight into the core product and test out workflows on the homepage without needing to create an account first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FCF-app-code%2Fcaptd-app%2Fmarketing-state%2Fassets%2F2026-W39%2F01-workspace-normal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FCF-app-code%2Fcaptd-app%2Fmarketing-state%2Fassets%2F2026-W39%2F01-workspace-normal.png" alt="CAPTD Snapshot workspace showing platform-specific captions" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Platform-specific caption generation inside the Snapshot workspace.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Head over to &lt;a href="https://captd.app/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=weekly-digest%3A2026-W39" rel="noopener noreferrer"&gt;captd.app&lt;/a&gt; to try out the new sample generator, test the upgraded histogram tool, or streamline your next photo drop.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This digest is compiled automatically from CAPTD's merged work. &lt;a href="https://captd.app/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=weekly-digest%3A2026-W39" rel="noopener noreferrer"&gt;captd.app&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>photography</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>TypeError: __exportAll is not a function — the deploy that only breaks after you merge</title>
      <dc:creator>CAPTD</dc:creator>
      <pubDate>Mon, 14 Sep 2026 06:01:22 +0000</pubDate>
      <link>https://dev.to/captd/typeerror-exportall-is-not-a-function-the-deploy-that-only-breaks-after-you-merge-4i89</link>
      <guid>https://dev.to/captd/typeerror-exportall-is-not-a-function-the-deploy-that-only-breaks-after-you-merge-4i89</guid>
      <description>&lt;p&gt;&lt;strong&gt;published: false&lt;/strong&gt;&lt;br&gt;
tags: vercel, nitro, tanstack, debugging&lt;br&gt;
Production went down twice in one day with the same error, and both times the branch had built and run perfectly on its own preview deployment. Here's what it was, why previews don't catch it, and the check that now stops it reaching production.&lt;br&gt;
&lt;strong&gt;The symptom&lt;/strong&gt;&lt;br&gt;
Every route returns a 500. Not a slow route, not one endpoint — the whole site. The runtime log says:&lt;/p&gt;

&lt;p&gt;TypeError: __exportAll is not a function&lt;br&gt;
    at file:///var/task/_ssr/server-ATlsWYy_2.mjs:1916:38&lt;br&gt;
    at ModuleJob.run (node:internal/modules/esm/module_job:439:25)&lt;br&gt;
    at async Object.fetch (file:///var/task/_ssr/ssr.mjs:177:56)&lt;/p&gt;

&lt;p&gt;The stack has no application code in it. It fails at module load, before any handler runs, which is why nothing is spared.&lt;br&gt;
The stack is also unhelpful in a specific way: server-ATlsWYy_2.mjs is a generated chunk name that changes on every build, and line 1916 is in code you never wrote. There is nothing to grep for in your own source.&lt;br&gt;
&lt;strong&gt;What __exportAll actually is&lt;/strong&gt;&lt;br&gt;
It's a bundler helper. When a bundler needs to hand you a module namespace object — the thing you get from import * as ns or from await import('./thing') — it generates a small function to copy the exports across. Different bundlers name it differently; in this output it's __exportAll.&lt;br&gt;
So the helper's presence means: somewhere, something asked for a whole module as an object rather than for named bindings.&lt;br&gt;
&lt;strong&gt;The cause&lt;/strong&gt;&lt;br&gt;
A dynamic import() of a module that is also imported statically somewhere else in the same graph.&lt;/p&gt;

&lt;p&gt;// at the top of the file&lt;br&gt;
import { buildClaimEmail, verifyClaimToken } from './purchase-claims.server'&lt;/p&gt;

&lt;p&gt;// ...and then, further down, inside a function&lt;br&gt;
const helpers = await import('./purchase-claims.server')&lt;/p&gt;

&lt;p&gt;That dynamic import buys nothing. The module is already in the bundle, already loaded, already reachable through the static import. But it forces the bundler to construct a namespace object for it anyway, and the helper that builds that object gets placed in whichever chunk the bundler thinks is shared.&lt;br&gt;
On Vercel, Nitro runs a second bundling pass over the already-bundled server output to produce the Lambda. That pass re-chunks. If the helper and the code calling it end up split across two chunks that import each other — in our case server-XXXX.mjs and its split twin server-XXXX2.mjs — you get a circular ESM import where one side reads the helper before the other side has finished defining it. At module-evaluation time the binding is still in its temporal dead zone, so the call site sees undefined.&lt;br&gt;
Hence: __exportAll is not a function.&lt;br&gt;
&lt;strong&gt;Why the preview build passes&lt;/strong&gt;&lt;br&gt;
This is the part that cost us the second outage.&lt;br&gt;
The branch's own preview deployment builds the branch tip. That build is fine. The crash appears only after merging, because the merge commit contains a different set of modules, which changes how the bundler groups chunks, which is what puts the helper on the wrong side of a cycle.&lt;br&gt;
So a green preview tells you nothing about whether the merge will boot. The artifact that breaks is one that nobody built until it was already in production.&lt;br&gt;
&lt;strong&gt;The fix&lt;/strong&gt;&lt;br&gt;
Delete the dynamic import. Use the static one that was already there.&lt;/p&gt;

&lt;p&gt;import { buildClaimEmail, verifyClaimToken } from './purchase-claims.server'&lt;/p&gt;

&lt;p&gt;That's the whole fix. The pattern has a name worth knowing — an ineffective dynamic import: a lazy import of something that isn't lazy, because it's eagerly imported elsewhere in the same bundle. It gives you none of the code-splitting benefit and all of the namespace-object cost.&lt;br&gt;
&lt;strong&gt;The check that stops it recurring&lt;/strong&gt;&lt;br&gt;
Two layers, both running at the end of the build.&lt;br&gt;
Source scan. Walk the source tree and report any module that is imported dynamically in one place and statically in another. Exclude type-only imports, since TypeScript erases those. This catches the root cause in milliseconds and points at both call sites with line numbers, which is far more actionable than a generated chunk name.&lt;br&gt;
Output scan. Read the built SSR output as an import graph and fail if a chunk that defines or imports the helper sits on an import cycle.&lt;br&gt;
That second layer needs calibrating, and this is the part I'd have got wrong by guessing: the mere presence of __exportAll in an app chunk is not the failure. A perfectly healthy build also constructs namespace objects — the framework does it for its own router and server entries. If you fail the build on "helper found", you'll fail every build.&lt;br&gt;
The actual crash signature is the cycle. We verified that by building both real commits with the production preset: the healthy one passes, the crashed one fails and names the offending module.&lt;br&gt;
&lt;strong&gt;Making CI test the merge result&lt;/strong&gt;&lt;br&gt;
Since the branch tip isn't what breaks, the check has to run against the merge commit.&lt;br&gt;
GitHub Actions gives you this for free on the pull_request event: actions/checkout checks out refs/pull/N/merge, which is the merge result rather than the branch tip. Build that, with the same preset production uses, and the check is examining the artifact that will actually deploy.&lt;br&gt;
Two repository settings make it stick, and neither is the default:&lt;br&gt;
    • Mark the job as a required status check.&lt;br&gt;
    • Enable Require branches to be up to date before merging, so the merge commit the job built is the one that lands.&lt;br&gt;
Without the second, you can pass the check on a stale merge base and still ship something nobody built.&lt;br&gt;
&lt;strong&gt;The general lesson&lt;/strong&gt;&lt;br&gt;
The specific bug is narrow — one framework, one host, one bundler pass. But two things generalise:&lt;br&gt;
A green preview is not a green deploy when your build output depends on the full module graph. Anything that re-chunks at deploy time has this property.&lt;br&gt;
Verify a guard by making it fire. We reintroduced the bad import deliberately on a scratch commit to confirm the build failed with a useful message, then removed it. A guard that has never failed is a guard you're only assuming works.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>From "twenty minutes per caption" to a real launch: the CAPTD story so far</title>
      <dc:creator>CAPTD</dc:creator>
      <pubDate>Wed, 09 Sep 2026 14:36:41 +0000</pubDate>
      <link>https://dev.to/captd/from-twenty-minutes-per-caption-to-a-real-launch-the-captd-story-so-far-mm1</link>
      <guid>https://dev.to/captd/from-twenty-minutes-per-caption-to-a-real-launch-the-captd-story-so-far-mm1</guid>
      <description>&lt;p&gt;I'm Marco. Twenty-five years as a TV cameraman, most of it on production sets, some of it on cruise ships, then Spain, then the UK, then Dublin, where I live now. Photography came later — my own thing, on my own time, separate from the job. I'm not a formally trained engineer. Everything you're about to read was built solo, with AI-assisted development, by someone who genuinely didn't know how to code six months ago.&lt;/p&gt;

&lt;p&gt;This is the real story of CAPTD — not the polished version, the actual one, including the parts that broke.&lt;/p&gt;

&lt;p&gt;The problem that started it&lt;/p&gt;

&lt;p&gt;Getting a shot right takes seconds. I've spent twenty-five years proving that to myself. But after the shot — writing a caption that doesn't sound like everyone else's, picking hashtags that actually work, writing alt text, figuring out what music fits — that took me twenty minutes. Every time. For every platform I wanted to post to.&lt;/p&gt;

&lt;p&gt;That gap — seconds to capture, twenty minutes to describe — is what CAPTD exists to close. Upload one photo, get a complete content pack back: caption, hashtags, alt text, a hook, a music suggestion. Tailored per platform, not one generic block of text stretched across nine different places, because that's not how any of these platforms actually work.&lt;/p&gt;

&lt;p&gt;The stack, and the honest disclaimer&lt;/p&gt;

&lt;p&gt;TanStack Start, Supabase, Google Gemini, deployed on Vercel. I chose this stack the way anyone does when they're learning: some of it because it made sense, some of it because it's what the AI-assisted tooling around me could work with well.&lt;/p&gt;

&lt;p&gt;The honest disclaimer, the one I keep repeating because it matters: I build this AI-assisted. I'm not writing every line by hand. I'm making the real decisions — what to build, what matters, what's broken and why — and using AI-assisted development to actually implement it. That's not a footnote. It's the actual story of how this got built at all.&lt;/p&gt;

&lt;p&gt;What CAPTD actually became&lt;/p&gt;

&lt;p&gt;Four workspaces, not one. Snapshot for a single photo. Video. Slideshow, for multi-image posts. Marketing, for pure text/voice-brief copy. Nine platforms, each with real character limits and tone conventions baked in — Instagram, Facebook, TikTok, YouTube, YouTube Shorts, LinkedIn, Pinterest, X, Bluesky.&lt;/p&gt;

&lt;p&gt;Beyond the core generator: a Creator Voice system, so you describe your tone once and it carries through every generation. A free tools section — exposure and depth-of-field calculators, golden hour timing, an AI photography assistant. A 28-lesson free Academy. A growing photography glossary. Multi-language support that now spans ten locales — Spanish, Italian, French, German, Portuguese (genuinely split into Brazilian and European variants, not just one generic "Portuguese"), Japanese, Chinese, Russian — with real linguistic care taken on every one of them, including things like Russian's genuinely complex plural forms.&lt;/p&gt;

&lt;p&gt;No signup required to try the core product. That was a deliberate choice, not an accident.&lt;/p&gt;

&lt;p&gt;The night everything nearly went wrong&lt;/p&gt;

&lt;p&gt;Here's the part I'm not going to sand down.&lt;/p&gt;

&lt;p&gt;After a redesign shipped — a real, full visual overhaul, new design system, every page rebuilt — something broke, silently, in production. Generation across every workspace started coming back wrong: English only, regardless of what language you'd selected. One variant instead of three. No emojis. Hashtags capped oddly. Alt text cut short. On mobile, generation was failing outright.&lt;/p&gt;

&lt;p&gt;The genuinely frightening part: nothing was throwing an error. The app's own built-in fallback system was quietly catching every failed AI call and returning fake, hardcoded "success" output instead — invisible to the existing error logging, because as far as the client could tell, nothing had failed at all.&lt;/p&gt;

&lt;p&gt;The root cause, once found: a deprecated Gemini model ID. One string, pointing at a model that no longer existed, silently triggering the fallback on every single call.&lt;/p&gt;

&lt;p&gt;Two things came out of that night that mattered more than the fix itself. First, a lesson about production error handling: a system that fails safely can also fail invisibly, and invisible failure is worse than a crash, because a crash gets noticed. Second, a real fix — proper logging wired into every failure path, so this specific class of silent failure can never hide again.&lt;/p&gt;

&lt;p&gt;The redesign, and the discipline of shipping in order&lt;/p&gt;

&lt;p&gt;The redesign itself — the actual visual work — never had a real bug reported once it was live. What broke was generation logic, in an unrelated part of the codebase, merged in earlier than the plan called for, before the intended live-verification pass had happened.&lt;/p&gt;

&lt;p&gt;The lesson wasn't "don't move fast." It was specific: verification steps exist for a reason, and skipping one — even under pressure, even when the thing you're skipping "shouldn't" matter — is exactly how an unrelated regression reaches real users.&lt;/p&gt;

&lt;p&gt;The uncomfortable truths about AI-assisted development at scale&lt;/p&gt;

&lt;p&gt;A few things I learned the hard way, worth naming honestly:&lt;/p&gt;

&lt;p&gt;Language instruction-following is a real, documented weakness in smaller AI models, not a bug in my code. Once traced properly, the fix wasn't "write a better prompt" — it was recognizing that a cheaper, faster model genuinely can't reliably follow an explicit language instruction the way a larger one can, and routing accordingly: cheap model for the common case, upgraded model specifically when the instruction-following actually matters.&lt;/p&gt;

&lt;p&gt;Vague instructions lose to specific, forceful ones, every time. Two separate real bugs — alt text coming back too short, emoji density too low — turned out to be the same underlying failure: a soft, hedged instruction sitting next to a much stronger competing instruction, and the model correctly, predictably, following the stronger one. The fix, both times, was making the real requirement explicit and impossible to deprioritize.&lt;/p&gt;

&lt;p&gt;Silent data loss is the most dangerous kind of merge conflict. More than once, resolving what looked like a routine git conflict — every visible hunk correctly favoring one side — would have silently destroyed real work that had merged in outside the visible conflict markers. The only real defense: comparing every resolved file's actual content against the target branch, line by line, never trusting a clean-looking resolution on faith alone.&lt;/p&gt;

&lt;p&gt;Building things that survive the real way people use software&lt;/p&gt;

&lt;p&gt;People don't sit and stare at a loading spinner. They navigate away. They check something else while a generation runs. For a long time, CAPTD didn't handle that gracefully — an upload, or a generation, or an edit to a field could silently vanish if you left the page at the wrong moment.&lt;/p&gt;

&lt;p&gt;Fixing that properly took building a real, persistent job system — one that lives outside the normal component lifecycle, survives navigation, and notifies you wherever you end up when the work finishes. Uploads survive it now. Full generations survive it. Regenerating a single field survives it too, with a genuinely careful design underneath: if you make a manual edit after starting a regenerate, the regenerate result — when it eventually arrives — can never silently overwrite your newer edit. Small detail. Took real thought to get right.&lt;/p&gt;

&lt;p&gt;What's next&lt;/p&gt;

&lt;p&gt;Real payments are coming. A proper public launch is scheduled for October 3rd on Product Hunt — the actual first real public moment for this product, not a soft-launch footnote.&lt;/p&gt;

&lt;p&gt;Getting ready for that meant genuinely new territory: real research into how Product Hunt actually ranks launches, building real, guideline-compliant community presence rather than anything that looks like gaming the system, and being honest with myself about which platforms and communities are worth real, sustained participation versus which ones aren't a fit for what I've actually built.&lt;/p&gt;

&lt;p&gt;The honest summary&lt;/p&gt;

&lt;p&gt;CAPTD started as a way to close a twenty-minute gap after every shoot. It became a real product with real users, real bugs, a real production incident, a real redesign, real translation work across ten languages, and a real launch date. None of it happened because I already knew how to build software. It happened because I kept showing up, kept being honest about what broke, and kept fixing it properly instead of covering it up.&lt;/p&gt;

&lt;p&gt;If you're building something solo, with tools you're still learning, and it feels slower and messier than you expected — it is. That's what building it for real actually looks like.&lt;/p&gt;

&lt;p&gt;Try CAPTD: captd.app&lt;/p&gt;

&lt;p&gt;Follow along, or find something broken and tell me — I'd rather know now than later.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>indiehackers</category>
      <category>ai</category>
      <category>saas</category>
    </item>
    <item>
      <title>The redesign is live — what changed, what broke, and what I fixed along the way</title>
      <dc:creator>CAPTD</dc:creator>
      <pubDate>Sat, 05 Sep 2026 17:56:37 +0000</pubDate>
      <link>https://dev.to/captd/the-redesign-is-live-what-changed-what-broke-and-what-i-fixed-along-the-way-4lfd</link>
      <guid>https://dev.to/captd/the-redesign-is-live-what-changed-what-broke-and-what-i-fixed-along-the-way-4lfd</guid>
      <description>&lt;p&gt;I'm Marco — solo-building CAPTD, an AI content-pack generator for photographers, around a full-time job, AI-assisted development, honest about all of it.&lt;/p&gt;

&lt;p&gt;Quick follow-up to my last post: the full redesign just shipped.&lt;/p&gt;

&lt;p&gt;What actually changed:&lt;/p&gt;

&lt;p&gt;Complete visual overhaul — new design system, every page rebuilt from scratch&lt;br&gt;
A real information-architecture rethink: instead of one flat nav, things are now grouped by what they actually are — the core Snapshot/Slideshow/Video workspaces live together under "Creator Suite," while Marketing, the AI Photography Assistant, and free tools sit as their own distinct items&lt;br&gt;
A new Account section — sign-in, history, and settings all in one predictable place instead of scattered&lt;br&gt;
Multi-language UI support, 10 locales in progress&lt;/p&gt;

&lt;p&gt;The honest part — real bugs found shipping this:&lt;/p&gt;

&lt;p&gt;Merging a redesign this size surfaced real problems I hadn't caught in testing: the AI was silently ignoring the selected output language in some cases, alt text was coming out way shorter than intended, and video uploads could die silently if someone navigated away mid-upload with no warning. All genuinely fixed now, and I'm glad they surfaced before more people hit them.&lt;/p&gt;

&lt;p&gt;Stack unchanged: TanStack Start, Supabase, Google Gemini, Vercel.&lt;/p&gt;

&lt;p&gt;What's next: real payments, a referral system, finishing the full-workspace translation, then an actual public launch.&lt;/p&gt;

&lt;p&gt;Try it, break it, tell me what's wrong: captd.app&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>design</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I've been building a photography content-pack generator solo for two months. Here's the actual stack and story.</title>
      <dc:creator>CAPTD</dc:creator>
      <pubDate>Thu, 03 Sep 2026 12:52:52 +0000</pubDate>
      <link>https://dev.to/captd/ive-been-building-a-photography-content-pack-generator-solo-for-two-months-heres-the-actual-2g05</link>
      <guid>https://dev.to/captd/ive-been-building-a-photography-content-pack-generator-solo-for-two-months-heres-the-actual-2g05</guid>
      <description>&lt;p&gt;I'm Marco. Twenty-five years as a TV cameraman before this, no formal engineering background. About two months ago I started building CAPTD, a tool that turns one photo into a full, platform-ready content pack — caption, hashtags, alt text, a hook, and a music suggestion — for photographers who don't want to spend twenty minutes writing captions after every shoot.&lt;br&gt;
I'm building this AI-assisted, not writing every line by hand, around a full-time job. I think that's worth saying plainly rather than pretending otherwise.&lt;br&gt;
What's actually live right now at captd.app:&lt;/p&gt;

&lt;p&gt;Four workspaces — a single photo, a video clip, a full slideshow, or pure text/voice-brief marketing copy&lt;br&gt;
Nine platforms supported, each with real character limits and tone conventions baked in, not one block of text stretched across all of them — Instagram, Facebook, TikTok, YouTube, YouTube Shorts, LinkedIn, Pinterest, X, Bluesky&lt;br&gt;
Creator Voice — describe your tone once, it carries through every future generation&lt;br&gt;
No signup required for the core product — the whole thing works before you ever make an account&lt;br&gt;
A genuinely free tools section, unrelated to the paid product: exposure and depth-of-field calculators, golden hour/Milky Way timing, an AI photography assistant, shot planners&lt;br&gt;
A 28-lesson free Academy and a growing glossary of photography terms&lt;/p&gt;

&lt;p&gt;Stack, if you're curious: TanStack Start, Supabase, Google Gemini, deployed on Vercel.&lt;/p&gt;

&lt;p&gt;What's next: a full visual redesign already in progress, a rewards/leaderboard system for the free tools, multi-language support, and real payments going live.&lt;/p&gt;

&lt;p&gt;I'll be posting build updates here as things ship. If you want to follow along or try it: captd.app&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>webdev</category>
      <category>ai</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I've been building a photography content-pack generator solo for two months. Here's the actual stack and story.</title>
      <dc:creator>CAPTD</dc:creator>
      <pubDate>Wed, 02 Sep 2026 14:28:03 +0000</pubDate>
      <link>https://dev.to/captd/ive-been-building-a-photography-content-pack-generator-solo-for-two-months-heres-the-actual-139g</link>
      <guid>https://dev.to/captd/ive-been-building-a-photography-content-pack-generator-solo-for-two-months-heres-the-actual-139g</guid>
      <description>&lt;p&gt;I'm Marco. Twenty-five years as a TV cameraman before this, no formal engineering background. About two months ago I started building CAPTD, a tool that turns one photo into a full, platform-ready content pack — caption, hashtags, alt text, a hook, and a music suggestion — for photographers who don't want to spend twenty minutes writing captions after every shoot.&lt;br&gt;
I'm building this AI-assisted, not writing every line by hand, around a full-time job. I think that's worth saying plainly rather than pretending otherwise.&lt;br&gt;
What's actually live right now at captd.app:&lt;/p&gt;

&lt;p&gt;Four workspaces — a single photo, a video clip, a full slideshow, or pure text/voice-brief marketing copy&lt;br&gt;
Nine platforms supported, each with real character limits and tone conventions baked in, not one block of text stretched across all of them — Instagram, Facebook, TikTok, YouTube, YouTube Shorts, LinkedIn, Pinterest, X, Bluesky&lt;br&gt;
Creator Voice — describe your tone once, it carries through every future generation&lt;br&gt;
No signup required for the core product — the whole thing works before you ever make an account&lt;br&gt;
A genuinely free tools section, unrelated to the paid product: exposure and depth-of-field calculators, golden hour/Milky Way timing, an AI photography assistant, shot planners&lt;br&gt;
A 28-lesson free Academy and a growing glossary of photography terms&lt;/p&gt;

&lt;p&gt;Stack, if you're curious: TanStack Start, Supabase, Google Gemini, deployed on Vercel.&lt;/p&gt;

&lt;p&gt;What's next: a full visual redesign already in progress, a rewards/leaderboard system for the free tools, multi-language support, and real payments going live.&lt;/p&gt;

&lt;p&gt;I'll be posting build updates here as things ship. If you want to follow along or try it: captd.app&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>webdev</category>
      <category>ai</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
