Inspiration

Most people do not miss a renewal because they forgot one date. They miss it because the dates depend on each other.

A passport has to be renewed before a visa. The visa has to be approved before a trip. A professional license needs continuing education hours before it can be renewed. A renters policy can lapse while you are away. Each item looks fine on its own, and the chain still fails.

I wanted a tool that plans the chain, checks the current official rule, and prepares the paperwork. Not another reminder that adds one more line to a calendar.

What it does

Unlapsed puts the document expiry watch first. It reads text-based PDFs of documents such as a passport, driver's license, insurance policy, and professional license. It extracts the holder, issuer, dates, and constraints, and keeps the exact source line for every fact.

When the user adds a dated event, the agent reads the event text, the destination, the destination country, the home location, and the document inventory. It infers whether the event is domestic or international, which documents can affect it, and how much confidence it has. The user can override the reading. The plan page shows the reading and the reason.

It then searches the official issuer site with Tavily for the current fee, processing time, required documents, and steps. It also checks the destination's passport validity rule and visa requirement on an official source. The result is stored with its URL, checked date, and confidence. If the official source does not state a value, the app marks it "verify manually" instead of guessing. For a non-India destination, a stated or unknown visa requirement becomes a generic visa verification task, not a fabricated application.

It builds a dependency-aware plan backward from the event. The seeded case is a synthetic US professional planning a trip to India. The passport expires on 14 June 2027, and the trip returns on 24 January 2027. The destination requires six months of passport validity beyond the return date, so the passport must be valid through 24 July 2027. The agent builds the passport renewal, then the India e-Visa, then the final travel check. It also flags the renters insurance lapse and the 30 continuing education hours for the professional license as parallel risks.

The same planner handles domestic travel, where the driver's license becomes the blocking document if it expires before the event. It also handles a move, a job start, and a generic dated event. With no event at all, it runs an expiry watch instead of inventing a trip.

It marks what blocks the event and what is a parallel risk, then generates a PDF packet with the checklist and form-ready data and an .ics calendar file. It does not estimate trip losses or other personal costs. Official renewal fees are shown in the evidence panel, with their source.

The public demo is read-only. The database is generated state and is seeded on first boot from the sample PDFs, so the public URL does not spend sponsor credits. The video shows the live extraction and verification, and the repository has the full interactive path.

How we built it

  • FastAPI and Jinja for the product.
  • SQLModel and SQLite for persistent memory, facts, requirements, travel rules, plans, tasks, and the activity log.
  • Nebius Token Factory for inference.
  • NVIDIA Nemotron Nano for document extraction and event analysis, and Nemotron Super for official-policy and travel-rule extraction.
  • Tavily for official-source search with a domain allowlist and citation capture.
  • pypdf for text PDF extraction.
  • ReportLab for the packet PDF.
  • A deterministic planner for the dependency graph, date math, and blocker labels. The model classifies and extracts; it does not decide the legal deadline.
  • No LangChain or LangGraph. The orchestration is a small Python service layer. The tools are direct function calls, not MCP servers.

Challenges we ran into

  • Keeping the model from inventing fees or processing times. Weak evidence becomes "verify manually."
  • Making the plan trustworthy. The dates and dependencies are code, not model output.
  • Letting the model read the event without letting it silently skip a document. The reading is shown, the user can override it, and any document that expires before the event is added back.
  • Replacing the fixed six-month passport rule with an evidence-backed rule from the destination's official source. When the source is missing, the app asks the user to verify the rule instead of assuming a period.
  • Resolving a city destination to a country so the passport and visa checks use the right official page. The country field is optional, but it removes ambiguity when the model cannot tell.
  • Keeping the demo simple. The app rejects scanned PDFs with a clear message instead of pretending OCR works.

Accomplishments that we're proud of

  • A complete path from PDF to evidence to plan to packet.
  • Provenance for every extracted fact.
  • A live official-source check that found the passport fee, processing time, and six-month validity rule.
  • A plan that separates blockers from parallel risks without inventing dollar losses.
  • A visible activity log and a scheduled run script.
  • A privacy story: PDFs are read in memory and not stored.

What we learned

  • The hard part of renewals is the dependency chain, not the reminder.
  • Official-source verification is more useful than a confident answer.
  • A small deterministic core makes the model output much easier to trust.
  • When a legal rule is missing, asking for manual verification is better than quietly assuming a value.

What's next for Unlapsed

  • OCR for scanned documents.
  • More country-specific visa workflows, beyond the generic verification task.
  • A trusted destination-country resolver for city and region names.
  • A source registry with change monitoring.
  • Authentication and encrypted storage for a production deployment.

Built With

  • fastapi
  • jinja
  • nebius-token-factory
  • nvidia-nemotron
  • pypdf
  • reportlab
  • sqlite
  • sqlmodel
  • tavily
Share this project:

Updates

Submission history