🚀 Free Lesson: Build a Fully Functional Calendar App with Just One Claude Skill and a JSON File
Learn how to turn plain natural language into a smart, self-updating calendar system — no coding, no setup, just pure structure and intelligence.
Just as I mentioned in the previous lesson — all you need to do is upload the SKILL.md file I’ve provided, and learn how to download the calendar.json file each time you start a new chat window in Claude.
Lesson 5: Build a Smart Shopping App with Just One Claude Skill
“Build an App with Just One Claude Skill and One .json File — No Code, Just Structure.” —Susan STEM
You start first by saying “create a new calendar”.
And it would initiate a new calendar.json file.
I added all the public school holidays, early release dates for 2 years in one sentence.
It works instantly — no more missed school days or forgotten early pick-up times for my kids!
You can even add your yoga classes, school schedules, favorite restaurants, or every restaurant in a given ZIP code — including their lunch specials — all using simple natural language, as long as the information is public.
Give it a try!
SKILL.md
---
name: personal-schedule-manager
description: >
Create, review, and edit a `calendar.json` file for schedules and routines.
Summarizes upcoming events, detects conflicts, supports recurring rules,
and runs natural-language multi-turn edits. Outputs a friendly summary and,
when requested or on create, the complete `calendar.json` to copy/replace.
Trigger phrase: “create a new personal calendar” (maps to intent=create with presets).
---
# ───────────────────────────────
# Inputs
# ───────────────────────────────
inputs:
- id: intent
type: string
required: true
description: One of: create | review | edit | export
- id: calendar_json
type: json
required: false
description: Paste full current `calendar.json` (omit for intent=create)
- id: instructions
type: string
required: false
description: Natural-language instructions (add/move/delete/recur/show conflicts/next 7 days)
- id: date_range
type: string
required: false
description: Optional range like “next 7 days”, “this month”, “2025-11-01..2025-11-30”
# ───────────────────────────────
# Outputs
# ───────────────────────────────
outputs:
- id: human_summary
type: markdown
description: Clear summary of actions taken, upcoming events, and any conflicts.
- id: calendar_json
type: json
description: Full updated file (on create/export, or when explicitly requested)
# ───────────────────────────────
# Behavior
# ───────────────────────────────
# • Default timezone: America/New_York (can be overridden via file or instruction)
# • Good initial defaults (优选初始值):
# - defaults.event_duration_minutes = 60
# - defaults.reminder_minutes_before = 30
# - defaults.work_hours = 09:00–17:00, MO–FR
# - defaults.priority = “normal”
# - defaults.category = “personal”
# • Recurrence: iCalendar RRULE (e.g., FREQ=WEEKLY;BYDAY=WE;UNTIL=20251218)
# • Conflict detection: overlapping active events in the same timezone
# • Destructive edits: show a diff; apply only after user says “apply changes”
# • Natural-language verbs: add | move | reschedule | delete | skip (occurrence) | duplicate | tag | remind
# • On intent=create:
# - Emit a fresh, canonical `calendar.json` with New York time + presets (see schema below)
# • Export: echoes the full canonical JSON
# ───────────────────────────────
# Schema (informative)
# ───────────────────────────────
# Top-level:
# {
# “version”: “1.1”,
# “timezone”: “America/New_York”,
# “defaults”: {
# “event_duration_minutes”: 60,
# “reminder_minutes_before”: 30,
# “work_hours”: {”start”: “09:00”, “end”: “17:00”, “days”: [”MO”,”TU”,”WE”,”TH”,”FR”]},
# “priority”: “normal”, # default priority for new events
# “category”: “personal” # default category for new events
# },
# “categories”: [”personal”,”family”,”work”,”school”,”health”,”finance”,”errands”,”travel”,”learning”],
# “priority_levels”: [”critical”,”high”,”normal”,”low”],
# “events”: [ Event ],
# “exceptions”: [ Exception ],
# “attendees”: [ Attendee ],
# “audit”: [ AuditEntry ]
# }
#
# Event:
# {
# “id”: “evt_001”,
# “title”: “Deep Work”,
# “start”: “2025-11-03T09:00:00”,
# “end”: “2025-11-03T10:30:00”,
# “timezone”: “America/New_York”,
# “location”: “Home Office”,
# “notes”: “No meetings.”,
# “tags”: [”focus”],
# “category”: “work”, # NEW: one of categories (or a custom string)
# “priority”: “high”, # NEW: one of priority_levels
# “recurrence”: null, # RRULE string or null
# “reminders”: [15], # minutes before start
# “status”: “confirmed”, # tentative | confirmed | cancelled
# “created_at”: “UTC-ISO”, # e.g., 2025-10-30T20:00:00Z
# “updated_at”: “UTC-ISO”
# }







Wow, the quote 'No Code, Just Structure' really stood out. It perfecly captures the power of AI skills for everyone. So smart!