Projects

Project Details

Red Tape — Municipal Permitting, Mapped 2026

Red Tape showing a food truck permitting process for Portland as a phased dependency graph with live fee and duration totals

Project Overview

A food truck in Portland is 8 steps, $1,745, and 5 weeks. In Houston it's 6 steps, $1,601, and same day. Red Tape maps municipal permitting processes — every step, fee, form, and waiting period for getting a project approved in a city, with a citation to the official document behind every number.

Pick a project, answer a short form, and get the whole process as a dependency graph with live running totals — then put two cities side by side and watch the difference write its own headline. Styled like a government form that developed a sense of humor.


Rules Are Data, Never Code

The core invariant: there is no if (city === 'portland') anywhere in the codebase. Jurisdictions own versioned process templates per project type, and everything downstream is generated from that data.

  • Schema: Steps form a dependency DAG, fees are typed rules (flat, per-unit, percent-of-valuation, tiered) in integer cents, and conditionals are a small JSON expression language over the project's parameters. Every step and fee carries a source-URL citation as a column, not a comment.
  • Rule engine: Pure functions with no database or GraphQL imports — it evaluates conditions strictly, splices removed steps out of the DAG, computes fees in integer cents, and reports durations as the critical path through the graph, so parallel steps don't sum.
  • The proof: Cities #2 and #3 (Houston and Denver — including Denver's three-agency flow and Houston's mid-2026 switch to statewide licensing) shipped as pure seed data with zero changes to application code.
  • Data freshness: A weekly job re-fetches every cited URL, fingerprints the content, and flags affected processes for human review — it never edits data itself.

Features & Rigor

  • Generated UI: The intake form is generated from each project type's parameter schema, the stepper renders whatever DAG the engine returns, and the two-city comparison headline is arithmetic over the totals.
  • Contribution flow: Adding a city is writing a seed file from official documents — the seed types make invalid data unrepresentable, and a contributor UI with admin approval runs the same server-side validator.
  • Honest limitations: Every process page says "not legal advice" and means it; data carries an as-of date, and known gaps (unpublished fees and processing times) are documented in open-questions files instead of papered over.
  • Tested: 109 API tests, with the rule engine covered by table-driven JSON fixtures that double as documentation of the expression language, plus a seed validator checking DAGs, conditions, cents, and citations.

Project Information

Role

Solo Developer

Type

Civic Tech / Full-Stack Web

Stack

RedwoodJS, TypeScript, React, GraphQL, Prisma

Infrastructure

Postgres, Render, background jobs for source freshness

Data

Official municipal documents for Portland, Houston, and Denver — primary sources only, cited per fact

Coverage

Three cities, extensible to any jurisdiction via seed data

Links
GitHub Repository