Skip to main content

January 2026

Highlights

Create custom shareable links for tracking where form responses come from. Each link can have its own UTM source, optional expiration date, and can be toggled open/closed independently. Perfect for distributing forms to schools, partners, or campaigns.

Tideswell Feature Parity

Terra now has complete feature parity with Tideswell, including form freezing, geolocation tracking, scheduled publishing, and outcome fields.

Data Access Layer (DAL)

New repository pattern for database access with built-in auth checks, audit logging, and soft delete support.

Background Worker

Lifecycle worker for scheduled form publishing, auto-close, auto-freeze, and cleanup tasks.

Documentation Overhaul

Comprehensive restructure with new information architecture, Mermaid diagrams, and Tideswell comparison guide.

All Changes

Features

  • feat(share-links): Custom shareable links with source tracking
  • feat(share-links): UTM source customization on link creation
  • feat(share-links): Link expiration dates with automatic closure
  • feat(share-links): Response count tracking per link
  • feat(share-links): Response limits per link (cap submissions)
  • feat(share-links): Open/close toggle independent of form status
  • feat(share-links): Rename links (UTM stays locked)
  • feat(share-links): Duplicate links with new name and UTM
  • feat(share-links): URL tooltip on hover
  • docs: Add share links documentation page

Tideswell Parity

  • feat(submissions): Add outcome field for applicant-visible results
  • feat(submissions): Add geolocation tracking (IP, country, city, region)
  • feat(forms): Add form freezing after first submission
  • feat(forms): Add scheduled publishing (published_at)
  • feat(forms): Add scheduled closing (closes_at)
  • feat(forms): Add featured questions for submission list display
  • feat(worker): Add background worker for form lifecycle automation
  • feat(api): Add /api/cron/worker endpoint for Vercel cron jobs

Data Access Layer

  • feat(dal): Create base repository with CRUD operations
  • feat(dal): Add forms repository with freeze/unfreeze methods
  • feat(dal): Add submissions repository with outcome methods
  • feat(dal): Add soft delete pattern with 30-day cleanup
  • feat(dal): Add pagination helpers with standardized result types
  • feat(dal): Add audit hooks for automatic change logging

Security

  • feat(security): Add centralized auth guardrails to server actions
  • feat(security): Add PII redaction helpers to logger
  • feat(files): Add retry and blocking behavior for required uploads

Fixes

  • fix(geolocation): Anonymize IP addresses for privacy (zero last octet)
  • fix(worker): Fix logger type errors for nested objects
  • fix(security): Add auth guards to form notification settings actions
  • fix(security): Add auth guards to notification test actions (email/SMS)
  • fix(security): Improve team permission backward compatibility with logging
  • fix(a11y): Add role="combobox" to address field for proper ARIA support
  • fix(types): Replace explicit any types with proper PostgrestError typing

Documentation

  • docs: Add Tideswell vs Terra comparison page
  • docs: Update background jobs with lifecycle worker
  • docs: Update submissions with geolocation and outcome
  • docs: Update publishing with scheduling and freezing
  • docs: Restructure with new information architecture

Database Migrations

  • migration 087: Add form_share_links table for custom shareable links
  • migration 088: Add share_link_id to submissions for source tracking
  • migration 089: Add expires_at to share links for expiration
  • migration 090: Add response_limit to share links for submission caps
  • migration 072: Add soft delete columns to forms and submissions
  • migration 073: Add Tideswell parity features
    • outcome, outcome_details on submissions
    • ip_address, ip_country, ip_country_code, ip_city, ip_region, user_agent on submissions
    • frozen, frozen_at, frozen_reason on forms
    • featured_questions on forms
  • migration 081: Add composite indexes for submissions performance
    • idx_submissions_form_deleted - optimizes active submissions queries
    • idx_submissions_form_deleted_at - optimizes deleted submissions queries

Migration Notes

Running Migration 073

# Apply the Tideswell parity migration
supabase migration up

Vercel Cron Configuration

Add to vercel.json:
{
  "crons": [
    {
      "path": "/api/cron/worker",
      "schedule": "* * * * *"
    }
  ]
}

All Changelogs

View all updates