Install
openclaw skills install @voronindenis5/schengen-clockUse when you travel (or plan travel) to Europe on a non-EU passport and must respect the Schengen 90/180 rule — a rolling window where any 180-day stretch allows at most 90 days of presence. Parses passport stamps / stay history, computes presence per rolling window, finds the current maximum allowed stay on any entry date, projects forward (can I add this trip?), flags the classic overstay traps (5-day overstay from poor counting, back-to-back long stays, the day-of-entry-counts rule), and generates a border-interview-ready itinerary letter. For tourists/visitors — doesn't handle residence permits, long-stay visas, or working-holiday schemes.
openclaw skills install @voronindenis5/schengen-clockThe Schengen 90/180 rule is simple to state and brutal to apply: in any 180-day window (rolling backwards from today, or from any entry date), you may be present at most 90 days — visa-free or on a short-stay visa. The rolling part is what destroys people:
This skill turns stay history into certainty:
All data in one local schengen.json. Travel history is nobody's cloud data.
stay add --entry 2026-05-10 --exit 2026-06-02 --country IT — record past/
future stays. Both dates count as presence days (day of entry AND day of exit
both count — this is the official counting).status --on 2026-10-01 — presence in the 180-day window ending that date,
remaining allowance, burn-down of which stays are inside the window.maxstay --entry 2026-10-12 — exact answer: if you enter Oct 12, the
longest legal stay is N days, allowance exhausted on date D.plan --entry 2026-11-01 --exit 2026-12-12 — verdict ALLOWED / TOO-LONG /
EXACT-FIT with details; shows what the trip does to future allowance.traps — pattern-scan the registry for the classic mistakes.letter --entry 2026-10-12 --exit 2026-11-20 — border-interview one-pager.# Record stays (past trips from passport stamps)
python3 scripts/schengen.py stay add --entry 2026-03-05 --exit 2026-03-18 --country FR
python3 scripts/schengen.py stay add --entry 2026-05-10 --exit 2026-06-02 --country IT # 24 days
python3 scripts/schengen.py stay add --entry 2026-07-01 --exit 2026-08-30 --country ES # 61 days
python3 scripts/sengen.py stay list # (typo-guarded anyway)
# Where do I stand today / on a date?
python3 scripts/schengen.py status # as of today
python3 scripts/schengen.py status --on 2026-10-01 # 43 used / 47 left in window
# If I enter on a date, how long can I stay?
python3 scripts/schengen.py maxstay --entry 2026-10-12
# → longest legal stay 47 days, must exit by 2026-11-27 (or earlier if rules change)
# Can I add this trip?
python3 scripts/schengen.py plan --entry 2026-11-01 --exit 2026-12-12
# → TOO-LONG: trip is 42 days, only 29 available in window ending 2026-12-12
# Classic-trap scan
python3 scripts/schengen.py traps
# Border letter
python3 scripts/schengen.py letter --entry 2026-10-12 --exit 2026-11-20
Storage: schengen.json in cwd (or --db). Fully offline.
| Rule | Implementation |
|---|---|
| Window | any 180-day period; for "status today", the 180 days ending today |
| Presence day | calendar day inside Schengen, entry day and exit day both count |
| Cap | 90 presence days per any 180-day window |
| Exit deadline | last day you may be present; overstay = presence on day 91+ |
| Overstay consequences | flags, fines, entry bans (typically 1–3 years), annulled visas |
traps flags this pattern.status, not vibes.status uses the 180 days ending on the query datemaxstay searches day-by-day for the true maximum (not an approximation)plan simulates the trip added to the registry and re-audits every windowtraps detects: back-to-back long stays, thin-margin (<5 days) plans,
stays ending inside the next 180 days, cumulative-year heavy usageletter output is dated, shows trips + allowance math, printablereferences/rule-explained.md — the 90/180 mechanics worked examples, border
interview tactics, overstay consequences by severity, FAQ