Commit graph

24 commits

Author SHA1 Message Date
corsacca
4dfee08d13 replace mailgun with sendgrid for transactional email
- send through the sendgrid v3 json api via direct fetch with a
  manually cleared abort timeout; mailhog stays for development
- drop nodemailer-mailgun-transport and its types
- swap MAILGUN_* runtime config and env example for SENDGRID_API_KEY
  and optional SENDGRID_HOST
2026-09-15 11:16:44 +01:00
corsacca
b94df99297 restore source edge whitespace on translated fragments
Formatting splits a sentence across text nodes mid-phrase, and no model
reliably reproduces a fragment's leading or trailing whitespace — a dropped
edge space glues two words together once the fragments are concatenated
back into the document. The source fragment now decides the edges.
2026-09-07 16:56:39 +01:00
corsacca
7dfad0ee07 replace deepl with llm translation via openrouter
- translateText/translateTexts call OpenRouter chat-completions; glossary
  terms are prompt-injected from config/glossaries.ts, generated from the
  translation repo's TSVs by scripts/build-glossaries.ts
- model resolution: per-language override in config/languages.ts →
  translation.model site setting (new admin field) → TRANSLATION_MODEL env
  → anthropic/claude-opus-5, at low reasoning effort
- blank fragments are held back from the model, which drops them and breaks
  the one-translation-per-fragment count the caller maps results back on
- OpenRouter failures map to a typed error with a human-readable message;
  an unrecoverable one (no credits, bad key, rejected model) stops the run
  instead of repeating the same call for every remaining locale
- machine translations record source 'auto-translate'; 'deepl' stays
  readable for snapshots written before the switch
2026-09-07 16:30:48 +01:00
corsacca
eae6143be1
Replace country pages with region dashboards (#23)
* replace country pages with region dashboards

- move /countries to /regions, with 301 redirects from the old URLs in
  every locale
- add a region dashboard: a map of the region's countries with pins
  coloured by prayer coverage, headline figures, and prayer, adoption and
  engagement progress against the DOXA goals, plus a per-country table
- roll up progress stats per country and region in the shared summary
  and serve them from /api/regions
- frame region maps with antimeridian-aware bounds
- add Regions to the hamburger menu and translate the new strings in all
  eight locales

* put each region on the regions index in a card with a header band

The region name links to its dashboard with the site's chevron icon, and
the people-group and country counts sit centred beside it on a brand-green
header; the country list is the padded white card body.
2026-09-07 11:49:24 +01:00
corsacca
ea5406c0e9 add per-country pages with dedicated highlight map
add /countries index grouped by WAGF region and /countries/[country] pages
derive countries from prayer API (slug, count, map center/zoom) via config/countries-meta and /api/countries
prerender country routes for all locales via modules/country-routes
add CountryMap component: highlight focus country, brand-green in-country pins, muted border pins, popups
show bold green note above the map stating people-group count
lock UupgsList to a country and link card country names to country pages
add i18n keys for the new strings
2026-06-15 12:09:44 +01:00
corsacca
314a1b9eee support unlisted vimeo and fix video display. 2026-05-22 10:15:30 +01:00
corsacca
01cd6ba4f4 support vimeo video embeds alongside youtube in cms editor
add framework-agnostic vimeo tiptap node (id-only src, renders player iframe)
register vimeo in shared extension set for editor and server renderer
replace youtube prompt with generic insert-video modal (detects platform)
allowlist vimeo in validator with digits-only src check
track vimeo as a lossy node for markdown round-trip detection
2026-05-21 14:31:27 +01:00
corsacca
6f918a9d85
Let categories have child categories for nested pages. (#6)
* Let categories have child categories for nested pages.

* fixes
2026-05-21 06:00:54 -05:00
corsacca
a8998bbed8 build tweaks. 2026-05-20 13:06:54 +01:00
corsacca
67e5d29a30 Don't throw errors when saving CMS pages. 2026-05-07 13:35:26 +01:00
corsacca
fb5c3bf486 mcp security 2026-04-29 15:07:30 +01:00
corsacca
127d89d084 Implement CMS MCP 2026-04-29 13:06:54 +01:00
corsacca
c85389f497 Add settings table and setting to disable registration 2026-04-28 15:17:26 +01:00
corsacca
54aaef6bae
User invitation (#3)
* Implement user invitation

* fix /admin styles clash on dev

* Fix user invite issues
2026-04-28 06:26:59 -05:00
corsacca
847258f9ae CMS page translation 2026-04-27 13:33:31 +01:00
corsacca
3355a926a2 Cache fixes 2026-04-23 18:16:37 +01:00
corsacca
4114e21042 Better CMS page routing and Caching. 2026-04-23 14:05:40 +01:00
corsacca
2d4e47af33 Central tiptap block definitions 2026-04-23 11:05:05 +01:00
corsacca
3dd17ef692 switch to public s3 for images in CMS 2026-04-23 10:56:15 +01:00
corsacca
a3919e0764 phase 7 2026-04-22 08:19:38 +01:00
corsacca
b2c7b22aa1 phase 6 2026-04-21 15:39:53 +01:00
corsacca
b2975650ec phase 5 2026-04-21 14:41:43 +01:00
corsacca
dd5255ba69 phase 1 2026-04-21 12:35:27 +01:00
corsacca
6f5313f990 init 2026-04-21 12:12:54 +01:00