Inspiration

In New York, most debt collection cases end in a default judgment because the person being sued never shows up in court. Often the reason is simple: they never got the court papers. The process server is supposed to hand them over, then swears in a signed form (an "affidavit of service") that they did. Sometimes the papers are thrown away and the form is signed anyway. This is common enough that New York has a name for it: "sewer service."

Most people find out when their bank account is suddenly frozen. By then a judgment exists, and the only record of what happened is a sworn statement saying "I handed the papers to this person at 7:42 PM at their front door."

Most of us carry a phone that quietly records where we are. So I asked a simple question: if the server swore you were at your door at 7:42 PM, and your phone says you were at work 10 km away, can that help you fight back?

What it does

ServeTrace helps a person who lost a court case without ever being told about it.

Upload your court papers. You upload the process server's affidavit of service as a PDF or photo. ServeTrace reads out the key details (date, time, address, how the papers were delivered, who received them) and shows them back to you to check and correct. Add where you were. You add your Google Timeline export, a bank or card statement, or type in where you were. The location file is read on your own device. Only the few hours around the claimed time are sent for checking, and the screen tells you exactly how many points that is. Get a clear answer. You get one of four results: your data conflicts with the affidavit, it is consistent with it, it doesn't settle it, or there is no data for that time. You see a map with the claimed delivery spot and your phone's trail, plus a plain sentence like "At 7:42 PM your phone was 10.6 km away."

It also checks the affidavit against New York's service rules, such as whether the papers were mailed within 20 days and whether the server really tried enough times before taping them to a door. It shows the deadline for asking the court to reopen the case, and it creates two downloads: an evidence packet and a draft supporting affidavit to bring to the court's help center or a legal aid office.

There is also an Advocate mode for legal aid workers. You upload a spreadsheet of many deliveries by the same process servers, and it finds deliveries that are physically impossible, like two services 15 km apart only 5 minutes apart. Banks run the same check to catch stolen cards ("how did this card get used in New York and Los Angeles an hour apart?"). I applied it to process servers.

ServeTrace never says anyone lied. It only says whether the data conflicts, and a judge decides what happened. If your data matches the affidavit, it tells you that just as clearly.

How we built it

Frontend: SvelteKit and TypeScript, with MapLibre for maps. It is designed for a phone first, because the person who needs this is probably reading on one. Location reading in the browser: A background worker reads large Google Timeline files (Android and iOS formats) without freezing the page. Your full location history never leaves your device. Backend: Python and FastAPI. The server stores nothing. There is no database, no accounts, and no saved cases. The checking engine: Plain, predictable Python code with every threshold written down. It asks one question: "Could this person have been at that door at that time, given where their phone was before and after?" If getting there would need a speed of more than 80 km/h through New York City streets, that counts as a strong conflict. The limits are set generously in favor of the process server on purpose. AI in one place only: Reading the fields off the uploaded affidavit, using Gemini. The checks, the verdict, and the documents are regular code and templates. No AI writes any part of a legal document. The app works with no AI at all: you can type the details in by hand. Documents: PDFs built from templates with WeasyPrint. The draft affidavit only uses details the user confirmed. Testing: A generator creates 500 made-up cases where I already know the right answer, and the engine is scored against them. There are hundreds of automated tests across the backend and frontend. Deploy: One Docker image on Render.

Challenges we ran into

GPS noise almost caused false alarms. Phone locations drift. When I added noise to the test data on purpose, I found a bug: a location 799 m from the door counted as "fine," but 801 m counted as a conflict. Two meters of GPS error should never decide whether a sworn statement is contradicted. I changed the math so it only counts distance beyond what the phone's own accuracy can explain, and the false alarms dropped to zero. Daylight saving time. When clocks go back in November, 1:30 AM happens twice. If an affidavit lists a time in that hour, ServeTrace checks both versions and uses the weaker result, so it never overstates a conflict. Huge location files. Some Timeline exports are hundreds of megabytes. I wrote a streaming reader so the page stays responsive. One bug in it only showed up with certain file shapes, and I found it with a test that cuts the same file at every possible point and checks the answer never changes. Things tests could not catch. The map once drew nothing at all, with no errors anywhere. The cause was a missing font setting that quietly broke a whole map layer. Printed documents also had layout problems that only showed up on paper. My lesson: look at the actual screen and the actual PDF, not just the test results. Writing for someone who is scared and not a lawyer. Every legal sentence had to be both correct and simple. I limited the app to a fixed list of legal facts with sources, and added automated checks that block words like "lied" or "fraud."

Accomplishments that we're proud of

Zero false conflicts across 500 test cases. Nobody was ever wrongly told their data conflicts with the affidavit, which is the mistake that could hurt someone in court. 100% of claimed delivery times read correctly across the test set, including the tricky cases. All planted rule problems caught (late mailing, not enough attempts, late filing), with none missed. Advocate mode found every planted impossible sequence and falsely flagged zero honest servers. It processes 2,000 records in about 20 milliseconds. Affidavit reading scored about 99% field accuracy on test documents, including scanned ones. Your location history stays on your phone, and the server keeps nothing. A demo mode that works with no internet, so the demo can't fail on stage. Honest results. If your data backs up the process server, the app says so.

What we learned

For a tool used in court, being careful matters more than being clever. One wrong "your data conflicts" does more harm than missing a real one, so I measured precision first. Test data must be labeled independently of the thing being tested. My generator decides the right answer from where it placed the person, never by asking the engine. Stress-testing with bad data finds real bugs that clean data hides. AI is useful for reading messy documents, but the decisions and the legal text should come from plain code that anyone can check. Always look at the real output. Several of the worst bugs passed every automated check.

What's next for ServeTrace

Test with real users at a legal aid organization, using real (consented, anonymized) cases. Support more location sources, such as Apple location data, ride-share receipts, and work badge logs. Add more courts and states. The rules are kept in one module, so adding a new place is mostly a matter of writing down its rules. Help users request the process server's own GPS record. NYC law already requires licensed servers to record the GPS location of every delivery. Let advocates export reports in the format needed for complaints to NYC's consumer protection agency (DCWP). Translate the app into Spanish and other languages common in the Bronx and Brooklyn.

Built With

  • docker
  • fastapi
  • gemini
  • httpx
  • hypothesis
  • jinja
  • maplibre
  • openpyxl
  • papaparse
  • pdfplumber
  • pydantic
  • pypdfium2
  • pytest
  • python
  • render
  • svelte
  • sveltekit
  • tailwindcss
  • typescript
  • uvicorn
  • vite
  • vitest
  • weasyprint
Share this project:

Updates

Submission history