- Installed on the healthbar-upsell-test dev store, built for the Health Bar shop.
- Period
- 2026
- Volume
- 110 commits, 45 features
- Stack
- React Router 7, Shopify App (managed install), Cloudflare Workers, D1, Workflows, KV, Anthropic SDK
A Shopify app that translates a store's content into its other languages and keeps it current — built as a replacement for Transcy. Shopify hands back every translatable field with a digest of the source text, so "what needs re-translating" is a query rather than a change detector. The key design decision: the app keeps its own record of WHO wrote each translation (a sync, a person, an incumbent app), which Shopify does not — that record is what lets a sync fill gaps without ever overwriting a human edit. A run is a Cloudflare Workflow with one durable step per page of resources; scheduled runs go through Anthropic's Message Batches API at half price.
Activity45 features
September 2026
- 8 SepMake the app chargeable, and fix the seven the review foundapp/lib/billing.ts app/routes/app.run-status.tsx
- 7 SepForget the fields of content that no longer existsapp/lib/db/fields.test.ts
- 7 SepFix what the max review found: uninstall and redact could miss, or hit a live shopmigrations/0026_registered_at.sql
- 7 SepMake the app submittable: compliance webhooks, optional write scopes, setup cardapp/routes/webhooks.compliance.tsx migrations/0025_setup_card.sql
- 4 SepHold the two sides of "out of date" to the same answerapp/lib/translation/standing.test.ts
- 4 SepClose the last five open items, and the 29 a review foundapp/lib/db/batches.ts app/lib/use-dirty-form.ts migrations/0023_last_admin_visit.sql migrations/0024_batched_calls.sql
- 3 SepMake the per-language image field, instead of explaining itapp/lib/shopify/image-field.ts app/routes/app.image-field.tsx
- 3 SepSay what the app could not read, and what it did readapp/lib/translation/gaps.ts migrations/0022_unreadable_sources.sql
- 3 SepSay it in the merchant's words, not the API'smigrations/0021_translation_model.sql
- 3 SepMake the two protective rules real settingsmigrations/0020_rules_are_settings.sql
- 3 SepSuggest products instead of making somebody guess a titleapp/routes/app.products.tsx
- 3 SepSend alerts without asking anybody for a key or an addressmigrations/0019_shop_email.sql
- 3 SepLet the picker reach past the newest two dozen filesapp/routes/app.images.tsx
- 2 SepBound every batch by the text it carries, not just by row countapp/lib/db/chunk.test.ts
- 2 SepSettings, against the mockup line by lineapp/lib/translation/resource-types.test.ts
- 2 SepA language chip is a link the router owns, and approving is not a writemigrations/0018_approval_is_not_a_write.sql
- 2 SepFix the crash on a checkbox, and the rules that did not line upmigrations/0017_metafield_labels.sql
- 2 SepFinish the artifact: the side panel, the scope switches, and the restmigrations/0016_excluded_types.sql
- 2 SepMake the screens look like the mockups, checked in a real adminapp/components/admin-ui.tsx
- 2 SepClose the gaps: the bars, the per-field actions, and settings that decide somethingapp/lib/shopify/admin-links.test.ts app/lib/shopify/admin-links.ts
- 2 SepSend the alerts, and finish the per-language imagesapp/lib/alerts/conditions.test.ts app/lib/alerts/conditions.ts app/lib/alerts/send.ts app/lib/db/alerts.ts migrations/0015_alerts_sent.sql
- 2 SepRebuild the four screens on the ownership indexapp/lib/translation/glossary-suggest.test.ts app/lib/translation/glossary-suggest.ts migrations/0014_glossary_upgrades.sql
- 2 SepSay how it should sound, and record what it costapp/lib/translation/diff.test.ts app/lib/translation/diff.ts app/lib/translation/formality.test.ts app/lib/translation/formality.ts app/lib/translation/pricing.ts
- 2 SepGroup content by the object it renders on, not by Shopify's bucketapp/lib/db/fields.ts app/lib/db/ownership.ts app/lib/shopify/ownership.ts app/lib/sync/index-store.ts app/lib/translation/ownership.test.ts
- 1 SepAnswer the nine UX findings that were left openapp/lib/review-list.ts app/lib/translation/sanitize.test.ts app/lib/translation/sanitize.ts
August 2026
- 31 AugAnswer the first five UX findings, and the search trapmigrations/0011_adoption_record.sql
- 31 AugFinish the four parts of the rebuild that were done differentlyapp/lib/use-action-toast.ts
- 31 AugTest the pure core, and fix what the first run of it foundapp/lib/db/translations.test.ts app/lib/translation/engines/llm.test.ts app/lib/translation/html.test.ts vitest.config.ts
- 31 AugHousekeeping the review found, and two scopesmigrations/0009_per_shop_engine.sql migrations/0010_drop_dead_schedule_cron.sql
- 31 AugRebuild the merchant screens rather than tidy themapp/lib/labels.ts app/lib/shopify/custom-data.ts app/routes/app.settings.tsx app/routes/app.translations.$resourceId.tsx
- 31 AugEvery way a shop stopped being synced, and nothing said somigrations/0006_run_failure_counts.sql migrations/0007_run_warnings.sql migrations/0008_opt_in_types.sql
- 31 AugThe database layer: close the hole in the never-overwrite ruleapp/lib/sync/field-status.ts
- 31 AugBand 1 of the review: seven things wrong on a normal dayapp/lib/db/chunk.ts migrations/0005_glossary_locale_sentinel.sql
- 31 AugGive the email-template flag a switch, and drop a column that liedmigrations/0004_drop_dead_engine_column.sql
- 31 AugShow image translations as images, not as a raw GIDapp/lib/shopify/files.ts
- 31 AugPut the client's last two decisions into the codeapp/lib/db/email-templates.ts migrations/0003_email_baseline.sql
- 28 AugAdd real translation engines behind the existing interfaceapp/lib/translation/engines/anthropic.ts app/lib/translation/engines/llm.ts app/lib/translation/engines/workers-ai.ts
- 27 AugAdopt existing translations, and stop hiding failed runsapp/lib/sync/import-existing.ts
- 27 AugAdd the translations and glossary screensapp/routes/app.glossary.tsx app/routes/app.translations.tsx
- 27 AugFix three silent gaps found reviewing the syncapp/lib/db/shops.ts
- 27 AugAdd 12-hour scheduler and a webhook that never translatesapp/lib/sync/process-resource.ts app/routes/webhooks.app.products_update.tsx migrations/0002_scheduling.sql workers/scheduler.ts
- 27 AugClassify all 30 translatable resource typesapp/lib/translation/resource-types.ts
- 27 AugAdd D1 data model and the never-overwrite ruleapp/lib/db/translations.ts migrations/0001_initial.sql
- 27 AugAdd MyMemory engine for testing the pipelineapp/lib/translation/engines/mymemory.ts app/lib/translation/html.ts
- 27 AugScaffold translation app on Cloudflare Workers.graphqlrc.ts app/entry.server.tsx app/globals.d.ts app/lib/shopify/translatable.ts app/lib/translation/engines/passthrough.ts