ideas.
October 21, 2026 3 min read mobileconsumerproductivity

Count your visa days before the border does

A phone app that tracks your trips and works out exactly how many days you have left under rolling visa limits like Schengen's 90/180.

The idea

A phone app whose entire job is answering one question: how many days can I stay, and until when? You log trips — dates in, dates out, country — and it computes your remaining allowance under rolling-window visa rules, starting with the Schengen 90-days-in-any-180 rule. Not a travel journal with a counter bolted on; a calculator that happens to keep your trip history, with a home-screen widget showing the number and the date it next changes.

Why build this

Anyone living between countries — remote workers, people with family abroad, freelancers chasing clients, dual-citizen families — eventually has to do this arithmetic, and the arithmetic is genuinely hard. The Schengen rule is a sliding window: for any given day, the previous 179 days plus that day must contain no more than 90 days of presence. Entry and exit days both count as full days. The answer changes every single day as old trips roll out of the window, so "I have 23 days left" is only true for today.

The official EU calculator exists, it works, and it is a desktop web form you re-enter every trip into. It won't tell you the latest date you could enter and still stay three weeks, which is the question people actually have while booking a flight. Meanwhile the consequence of getting it wrong is a refused entry or an overstay flag that follows you for years, and the EU's Entry/Exit System now records crossings biometrically — the border's count is automated and exact, so a guess in a notes app is no longer good enough.

Stack sketch

  • React Native via Expo, iOS and Android from one codebase. The app must work offline in an airport queue, so everything local-first.
  • expo-sqlite for trips; the whole dataset is a few hundred rows forever.
  • @js-temporal/polyfill for date handling. PlainDate with explicit day arithmetic, no Date, no timezone-shifted off-by-one days.
  • A pure TypeScript rules module: given a list of {start, end, regime} intervals and a reference date, return days used, days remaining, and the next date the number changes. Property-based tests with fast-check.
  • expo-notifications for local alerts at a configurable threshold, scheduled on-device.
  • WidgetKit (iOS) and a Glance widget (Android) through an Expo config plugin, reading a cached value written by the app.
  • expo-calendar to pull candidate trips from existing calendar events so the first run isn't thirty manual entries.

Scope for v1

  • Manual trip entry: country, entry date, exit date, with an open-ended "I'm here now" state.
  • Schengen 90/180 only, computed correctly, with a day-by-day table showing which trips consume which days.
  • A planner: pick a desired stay length, get the window of dates where it fits.
  • Widget plus one notification threshold.
  • Local export and import as JSON.
  • Out: passport stamp OCR, flight-email parsing, accounts, sync, any other visa regime, anything resembling legal advice.

Where it could go

Other rolling regimes are the obvious next step, and they are all slightly different: the UK's rough six-months-per-visit practice, the US B-2 and its substantial-presence tax test, Japan's 90 days per entry, and national long-stay visas that sit on top of Schengen and change the maths. Each regime is a small plugin against the same interval engine, which is why the engine should be pure and separately tested from day one.

The second path is getting data in without typing. Stamps photograph badly — faded ink, overlapping impressions, varied formats — but boarding passes do not: an Aztec code on a boarding pass carries origin, destination and date in a parseable format, and airline confirmation emails are structured enough for a shared parser. A third path is paid: generate a PDF travel history formatted for a residency or citizenship application, where applicants currently reconstruct five years of movements by hand.

Watch out for

The hard line is advice. The app computes dates from the data a person entered; it cannot know about unrecorded crossings, visa exemptions, or a residence permit that changes which rule applies, so the output needs framing as a calculation of their own data and never as clearance to travel. Second, the rolling window has edge cases people disagree about — a same-day entry and exit, a trip that straddles a visa's start — and the day-by-day table is what makes those auditable instead of a number the user has to trust.