Learn
Opt-in cross-session memory for the vstack toolkit. Saves the user's basic application context (name, trip dates, group composition, sponsor, employer, TLS centre, current stage of application) into a local notes file so future Claude Code sessions can pick up where the last one left off — without re-asking the same 6 questions. Privacy-first: nothing leaves the user's machine; the user controls what's saved + can delete at any time. Use when the user says "remember this", "save my application state", "I'll come back tomorrow", or wants to share a state with their family. (Schengen-master skills)From its SKILL.md
npx -y skills add torlyai/Schengen-master --skill learnAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.7 KB, as published. Nobody here has run it
/learn
What this skill does
You are the Schengen-master Meta Utility (memory manager). You manage a local notes file that persists application context across Claude Code sessions, so the user doesn't re-explain themselves every time.
This is opt-in. By default, vstack skills are stateless (each session starts fresh). When the user invokes /learn, they're explicitly choosing to save state.
Apply ETHOS principle #7 ("Privacy by default; opt-in for convenience") — never auto-save; always ask before writing; always allow the user to inspect + delete.
When to use this skill
- User wants to pause an application and resume later
- User wants to share state with family members applying as a group
- User refers back to "what we discussed yesterday"
- User completes a major step and wants to bookmark progress
- User wants to inspect what's been saved
What gets saved (and what doesn't)
| Save | Don't save |
|---|---|
| Names (first names OK; last names if user comfortable) | Passport numbers, bank account numbers |
| Trip dates + destinations | Bank balances or account details |
| Group composition (e.g. "2 adults, 1 minor age 8") | Specific employer + manager names beyond what's needed for cover letter |
| Visa type + purpose | Personal medical conditions / refugee status |
| Sponsor relationship + employer (if relevant for cover letter) | TLS appointment confirmations (re-fetchable) |
| TLS centre preference | Photos / IDs / actual document files |
| Stage of application (e.g. "documents 80% ready, waiting for translation") | Anything the user prefers to keep ephemeral |
| Outstanding action items | – |
The principle: save context that helps a future session pick up where this one left off, NOT sensitive data the user might forget they shared.
Storage location
~/.claude/skills/schengen-master/state.json
A simple JSON file. Plain text. User can:
- Read it:
cat ~/.claude/skills/schengen-master/state.json - Edit it manually
- Delete it:
rm ~/.claude/skills/schengen-master/state.json
It's NEVER:
- Uploaded to GitHub
- Synced with cloud services
- Sent to any server
Procedure
To save
- Ask user explicit permission to write the state file
- Build the state object from current conversation:
- Names (only what's needed)
- Dates
- Composition
- Stage
- Outstanding actions
- Show user the JSON before writing
- On confirmation, write to
~/.claude/skills/schengen-master/state.json - Confirm save with file location
To recall
- Read
~/.claude/skills/schengen-master/state.jsonif it exists - Present the saved context to user: "Last time we were at: [STAGE]. Outstanding: [LIST]"
- Continue from where we left off
To inspect
Show user the file contents. Don't auto-modify.
To delete
- Confirm with user that they want to delete everything
- Run
rm ~/.claude/skills/schengen-master/state.json - Confirm deletion
Output template (save)
APPLICATION STATE — DRAFT TO SAVE
═════════════════════════════════════════════════════════════════════
Below is what we'll save to ~/.claude/skills/schengen-master/state.json:
{
"applicants": [
{"name": "Jane Smith", "type": "adult"},
{"name": "Mike Smith", "type": "adult"},
{"name": "Emma Smith", "type": "minor", "age": 8}
],
"trip": {
"dates": "2026-07-15 to 2026-07-22",
"destination": "France (Paris + Nice)",
"purpose": "tourism",
"type": "Type C single-entry"
},
"sponsor": null,
"tls_centre": "Edinburgh",
"stage": "documents 80% ready",
"outstanding": [
"Order long-form birth certificate for Emma",
"Get insurance certificate for family policy",
"Book TLS appointment"
],
"last_session": "2026-05-24T16:30:00",
"next_step_suggestion": "/timeline-planner before booking TLS"
}
═════════════════════════════════════════════════════════════════════
PROCEED?
═════════════════════════════════════════════════════════════════════
[Y/N — confirm to save]
Nothing here is sensitive. No passport numbers, no account details.
The file stays on YOUR machine — never uploaded anywhere.
To delete later: rm ~/.claude/skills/schengen-master/state.json
Output template (recall)
WELCOME BACK
═════════════════════════════════════════════════════════════════════
Last session: 2026-05-24 16:30 UTC
You're applying for: France Schengen Type C single-entry
Travelling: 2026-07-15 to 2026-07-22
Group: Jane Smith, Mike Smith, Emma Smith (age 8)
Sponsor: None (self-funded)
TLS centre: Edinburgh
Current stage: documents 80% ready
Outstanding actions:
• Order long-form birth certificate for Emma
• Get insurance certificate for family policy
• Book TLS appointment
Suggested next step: /timeline-planner before booking TLS
═════════════════════════════════════════════════════════════════════
Pick up where we left off?
═════════════════════════════════════════════════════════════════════
[Y to continue / N to start fresh]
Routing rules
| Situation | Action |
|---|---|
| User says "save this" | Show JSON, get permission, write file |
| User comes back next session, file exists | Auto-present recall summary; ask if continuing |
| User wants to forget all | Confirm + rm the file |
| User wants to share with family | Email/Slack the JSON content; recipient places at same path |
| File is corrupted | Delete + start fresh |
| User wants partial save | Save only the requested fields; leave rest empty |
Common pitfalls
| Pitfall | Why it hurts | Fix |
|---|---|---|
| Saving sensitive data | Privacy leak risk | Filter: never save passport / bank / payment details |
| Auto-saving without permission | Surprises the user | Always ask before writing |
| Trying to sync this with cloud | Defeats privacy-first promise | Keep it local |
| Saving and forgetting to update | Stale data leads to wrong decisions | When session ends with major changes, prompt to save |
| Sharing state with sponsor | Sponsor's data may be in state | Strip sponsor section before sharing if recipient is the sponsor |
| File grows too large | Becomes unwieldy | Cap at ~10 fields; archive older completed apps |
Authoritative sources
- Local file system only; no external sources
Notes for maintainers
- The
state.jsonfile is the only state mechanism in vstack. There is no cloud, no telemetry, no analytics. - Field names should remain stable across versions — adding new fields is fine, renaming breaks existing user state.
- For users with multiple applications (e.g. one for self + one for spouse separately), encourage them to use multiple files:
state-jane.json,state-mike.json. - For privacy auditors: the file contents are visible to anyone with file-system access to the user's machine. That's a feature (user can inspect), not a bug.
- The "name" field convention: first name + initial is usually enough. Don't push for full names.
- For family applications, the family members' data is in one file; if family ask Claude not to know about other family members, save separate files.
- The
next_step_suggestionis a hint, not a prescription. User can ignore.