All deployments

Peter Theill
Peter Theill 
deployed a security update 2 days ago
Peter Theill
Peter Theill 
deployed a performance improvement 2 days ago
2 days ago
⚑️ Speed up deploys with a cached build on the server
Build with Kamal's remote builder on the server so the BuildKit cache
persists, and drop CI steps that are no longer needed
Peter Theill
Peter Theill 
deployed a documentation update 2 days ago
Peter Theill
Peter Theill 
deployed a documentation update 3 days ago
3 days ago
πŸ”₯ Remove .windsurfrules; AGENTS.md is the agent instructions file
πŸ“ Replace Copilot instructions with AGENTS.md for all coding agents
Peter Theill
Peter Theill 
deployed a documentation update 3 days ago
3 days ago
πŸ”₯ Remove .windsurfrules; AGENTS.md is the agent instructions file
πŸ“ Replace Copilot instructions with AGENTS.md for all coding agents
Peter Theill
Peter Theill 
deployed a feature 3 days ago
Peter Theill
Peter Theill 
deployed a documentation update 3 days ago
3 days ago
πŸ“ Replace Copilot instructions with AGENTS.md
πŸ”₯ Remove .windsurfrules
Peter Theill
Peter Theill 
deployed a security update 3 days ago
3 days ago
πŸ”’οΈ Blocks hold on the website too; reports only reach what the reporter can see

  • The web comment form and "ask for this item" now honour blocks, and the


rule lives in the model (Donation#open_to?, a Comment validation), so any
future path is covered as well.

  • The web comment controller hides drafts like the donation page does.

  • Reports of a draft listing, or of a comment on one, 404 for anyone but


the owner, so they can't be used to find out that a draft exists.
Peter Theill
Peter Theill 
deployed a documentation update 3 days ago
3 days ago
:shield: Report, block, filter and terms for user content; new privacy policy and terms; OpenStreetMap tiles
What App Review guideline 1.2 asks of an app with user content:

  • Reports of listings, comments and people (POST /api/reports), emailed to


support straight away.

  • Blocks (/api/blocks): a blocked person's listings, comments and activity


are hidden, their requests are withdrawn, and they can no longer ask for
or comment on the blocker's things.

  • A whole-word filter (config/content_filter.yml) on listing titles,


descriptions and comments, in all seven languages.

  • App users must accept the terms (POST /api/me/accept_terms) before they


post, comment or ask for things.
The privacy policy now names every service that handles data (Hetzner,
Resend, OpenAI for photo suggestions, the sign-in providers), how long data
is kept and how to delete an account; the terms state zero tolerance for
objectionable content and how reports are handled. Both are now in all
seven languages instead of English only.
Maps use OpenStreetMap's tiles, with the attribution they require, instead
of Carto.
Peter Theill
Peter Theill 
deployed a performance improvement 4 days ago
Peter Theill
Peter Theill 
deployed a configuration change 4 days ago
Peter Theill
Peter Theill 
deployed a feature 4 days ago
4 days ago
🌐 Answer the API in the asker's language, photo suggestions too
The API skipped localized routes and so always spoke the default language:
errors, activity messages and notification text reached a Danish iPhone in
English. It now follows Accept-Language. Photo suggestions (title and
description) are written in the request's language as well, on the web
form too.
πŸ”’οΈ Scope API tokens, use an https sign in callback, never link Apple sign in by email

  • ApiTokens get a scope: mcp tokens (made on the settings page) only work on


/mcp, and the iPhone app's tokens only on /api.

  • The website hand-off redirects to https://<host>/app/callback, which iOS


only gives to the app named in the new apple-app-site-association, instead
of a custom URL scheme any app could claim.

  • Sign in with Apple no longer signs in to an existing account with the same


email, since emails here are not verified.
✨ JSON API for the new iPhone app
Bearer token auth on /api with the existing ApiTokens, Sign in with Apple
(POST /api/session/apple), and a website hand-off at /app/authorize so every
existing way of signing in works in the app without it handling passwords.
Adds posting with a photo, editing and deleting, requesting, approving and
rejecting, regions, charities filtered by currency, notifications, and the
account (including deleting it, which App Review requires).
Peter Theill
Peter Theill 
deployed a bug fix 4 days ago
4 days ago
πŸ› Return real image URLs from the JSON API and stop leaking internal fields
The API serialised donations with as_json, so image_url came back as the
Active Storage attachment (with the whole record nested inside) instead of
a URL, and every column was exposed - requesters, unsubscribers, transfer,
transaction_id, and a comment's payment details.
Responses are now built field by field, with image_url, thumbnail_url,
charity logo_url and user avatar_url as URLs. Drafts 404 through the API
for anyone but their owner, matching the web page.
✨ Double down on SEO and AEO
Structured data on every public page (Organization sitewide, Product,
NGO, Place, ProfilePage, CollectionPage, Article, BreadcrumbList),
robots directives with noindex on personal and search-result pages,
a sitewide RSS feed, image entries in the sitemap, and llms.txt /
llms-full.txt rendered from the database instead of static files.
Translate the SEO category landing pages and giving guides into
Swedish, Norwegian, German, French and Spanish, and move the guides'
hardcoded badges and calls to action into locale keys.
Peter Theill
Peter Theill 
deployed a documentation update 4 days ago
Peter Theill
Peter Theill 
deployed a feature 7 days ago
Peter Theill
Peter Theill 
deployed a feature 8 days ago
8 days ago
Merge pull request #71 from theill/api-v1-documents
Add JSON upload API for native clients
✨ Add JSON upload API for native clients
POST /api/v1/documents creates a document from a multipart file (or
files[]) and returns its view_url, edit_url and expires_at. Files over
100 MB go through POST /api/v1/direct_uploads, a CSRF-free mirror of
Active Storage's direct uploads, and are attached by signed_ids[].
The controllers inherit from ActionController::API, answer errors as
JSON and are rate limited per IP. Documented in README and llms.txt.
Support
Support 
deployed a feature 8 days ago
8 days ago
✨ Add a create-label dropdown with a chat option ✨ Add photo labels and image AI to Settings > Media ✨ Add skills tab to place and event types ✨ Chat with the label specialist on Labels ✨ Choose when agent tools are loaded ✨ Configure forms shown by assistants ✨ Create via chat from a place or supplier as defaults ✨ Give every list the same Add menu with create via chat ✨ Hide added skills in the library by default ✨ Move agent tools and outputs to their own tabs ✨ Open the supplier dashboard as the supplier ✨ Reset system agents and skills from settings ✨ Show agent outputs and tools as list-style tabs with status views ✨ Show photo labels in the lightbox and edit chat photo results ✨ Show system agent instructions read-only next to Ekstra instruktioner ✨ Show the GuideDanmark upscale when approving ✨ Show which types a skill is used on πŸ› Keep "all matching" when a row is deselected πŸ› Keep skill library groups from clipping cards πŸ› Offer accept on single-record deletions and call them deleted πŸ› Open supplier trip drawer in supplier dashboard πŸ› Open the add label menu under its button πŸ› Put each output and tool in one status view πŸ› Send create defaults with the chat message πŸ› Show GraphQL errors without a stack trace outside development πŸ› Type the dashboard hook spec's mock like the other specs
Support
Support 
deployed a bug fix 10 days ago
10 days ago
✨ Show supplier dashboard activity πŸ› Convert HEIC photos to JPEG before upload πŸ› Refresh the GuideDanmark state after publishing manually πŸ› Show deactivated events to suppliers
Support
Support 
deployed a feature 10 days ago
10 days ago
✨ Choose which watched fields run immediately ✨ Limit watched fields to the values that matter ✨ Run automations on the current entity ✨ Set KΓΈr straks on each watched field ✨ Show GuideDanmark sync on the publication card ✨ Show sending state for segment messages ✨ Show the sites an agent searched as favicon chips πŸ› Allow adding a price with only a name πŸ› Disable adding a price without a name πŸ› Require an amount or free for a price πŸ› Show failed GuideDanmark publication
Support
Support 
deployed a feature 12 days ago
12 days ago
✨ Add automation library ✨ Fold the plan into the work once the answer streams ✨ Name a search's single result and show suppliers readable tool details ✨ Replace chat fast mode with a model picker ✨ Reset library automations instead of generating metadata πŸ› Close library modals on overlay click πŸ› Hide focus ring on the drawer return-focus target πŸ› Keep closed linked automation drawers closed πŸ› Keep failed lookups from calling entities deleted πŸ› List every locale a run reads πŸ› Open every linked chat entity in place πŸ› Open skills from chat in a drawer πŸ› Steady proposal cards and label batches by run