Skip to main content

Tideswell vs Terra

Terra is a modern reimagining of Tideswell, built with lessons learned from years of operating government intake infrastructure.
Terra isn’t a fork of Tideswell—it’s a clean-slate rebuild that achieves feature parity while fundamentally rethinking the architecture. This page explains the relationship, the differences, and why we made the choices we did.

The Relationship

Tideswell was the original government intake platform, built to handle benefit applications at scale. It served its purpose well, processing hundreds of thousands of applications. But like all software, it accumulated technical debt. Terra is the successor. Same mission, new architecture. We took what worked in Tideswell, fixed what didn’t, and rebuilt from first principles with modern tools.

Feature Parity Status

Terra has achieved full feature parity with Tideswell. Here’s how the features map:

Core Intake Features

Form Lifecycle

Identity & Verification

Integrations

Compliance & Audit


Architectural Differences

Database: MongoDB → PostgreSQL

Why we changed: PostgreSQL gives us:
  • ACID transactions for multi-step operations
  • Foreign key constraints that prevent orphaned records
  • Row Level Security at the database layer
  • JSONB for schema flexibility without sacrificing structure

Auth: Custom → WorkOS

Why we changed: Tideswell rolled its own authentication. It worked, but required ongoing maintenance for security patches, session management, and OAuth providers. Terra uses WorkOS because:
  • SSO (SAML, OIDC) is built-in for enterprise clients
  • MFA is handled by the provider
  • Security patches are their responsibility
  • We focus on intake, not auth

Queue: File + Memory → Database

Why we changed: Tideswell used a file-based queue with in-memory fallback. This caused problems:
  • Jobs lost on server restart
  • No visibility into queue state
  • Hard to debug failed operations
Terra uses a database-backed queue:
Benefits:
  • Durable: Jobs survive restarts
  • Visible: Query the table to see queue health
  • Debuggable: Failed jobs have error messages
  • Scalable: Multiple workers can claim jobs

Frontend: Express + EJS → Next.js + RSC

Why we changed: React Server Components give us:
  • Type safety across client/server boundary
  • Automatic code splitting per route
  • Streaming for large pages
  • Server Actions that are just function calls

What We Kept

Not everything changed. These patterns worked well in Tideswell and survived into Terra:

JSON Form Schema

Both platforms store form definitions as JSON. The schema structure is similar:

Async-First Submission Flow

Both platforms follow the same pattern:
  1. Validate and save submission (sync)
  2. Queue integrations (async)
  3. Process queue (background worker)
This ensures submissions never fail due to integration issues.

Multi-Language as Core

Both platforms treat translations as first-class citizens. Every label, error message, and piece of content supports multiple languages through the I18nString pattern.

Audit Everything

Both platforms log every significant action. The implementation differs (MongoDB events vs PostgreSQL table), but the philosophy is identical.

Migration Path

Moving from Tideswell to Terra isn’t automatic—the data models are different enough that a migration script is required. Key mappings: The form schema itself is largely compatible—Terra can import Tideswell form definitions with minor transformations.

Why Not Fork?

We could have forked Tideswell and incrementally improved it. We didn’t because:
  1. Tech debt compounds: Tideswell’s architecture made certain improvements expensive. Changing the database, auth system, or queue would have required touching every file.
  2. Clean slate enables experimentation: We could try RSC, Zustand, Zod, and other modern tools without worrying about breaking existing code.
  3. Documentation opportunity: A fresh codebase meant we could document everything from day one, rather than trying to document organic growth.
  4. Type safety throughout: TypeScript in a greenfield project is trivial. TypeScript retrofitted onto a JavaScript codebase is painful.
The tradeoff: we lost Tideswell’s battle-tested edge cases. But we gained a codebase that’s maintainable for the next decade.

Going Forward

Terra is now the primary platform. Tideswell remains operational for existing deployments, but new features land in Terra first. Our commitment:
  • Feature parity: Anything Tideswell can do, Terra can do
  • Migration support: We’ll help teams move from Tideswell to Terra
  • Shared learnings: Bugs found in Tideswell inform Terra’s design

Summary

Same mission. Modern architecture. Lessons learned.

Next Steps

Design Philosophy

The principles behind Terra’s decisions

Core Concepts

Mental models for understanding Terra