Lattice
A workspace for your research.
All your calendars, run by an AI agent you can text. Free, open source, and your data stays local.
ProductivityTypeScript · CSSGitHub @hunterZh37OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Free Calendly alternative run by a 24/7 AI agent: syncs all your calendars, finds the time that works across them, and books meetings for you, over WhatsApp, Slack, or the web. No irritating setup, and your data stays local.
Taken from the repository README
Loading the full README.
Read the full README ↗All your calendars, run by an AI agent you can text.
When you have multiple calendars, scheduling a meeting takes real time and mental energy: you cross-reference every calendar to find the one time that works across all of them.
That's why I built an agent that synchronizes all your calendars, checks availability, and schedules meetings for you 24/7, so you never have to hunt for an open slot across your calendars again.
Free + Calendly without the irritating setup + Google Calendar UI + a 24/7 agent, and your data stays local.
Landing page · See it live: book time with me
The tour. Each feature gets a one-line caption, then the visual: the calendar UI, your agent adding an event from a text request, the visitor assistant answering availability questions, the Calendly-style booking page, the reminders, scheduling over WhatsApp or Slack, and the Chrome extension. Event titles are blurred for privacy. (full-quality video)
Everything the demo covers, one screenshot per feature.
Events, bookings, and time blocks from every connected account in one view, with the day's agenda and your agent alongside. (Event titles blurred for privacy.)
Your dashboard has an agent in the right-hand panel. Tell it the what and the when in plain text ("Add Coffee with Sam this Thursday 3:00 to 3:30 PM", captured live above) and the event lands on the calendar. You never have to click around the UI or send an invite by hand again, and it never mistakes AM for PM.
People scheduling meetings with you don't click around either. They ask generic questions like "When are you available on Tuesday?" and the agent replies with the real open slots, then books the one they pick.
Visitors pick a length and a day, and only see slots that are genuinely open across every connected calendar, revalidated at booking time so a slot that was just taken cannot be double-booked. The same flow works on a phone:
While a day's times panel is open, the address bar reads /book?date=YYYY-MM-DD
(plus &duration= when a non-default length is picked). Copy and send it: the
link opens the booking page with that day's panel already open.
Attendees and the owner get reminders for upcoming meetings over email and approved WhatsApp templates, rendered above from the real templates with sample data. A claim/dead-letter worker retries failed sends instead of dropping them.
Invite your agent to WhatsApp, even Slack, and schedule meetings entirely over text: create, move, or cancel events, check availability, and get booking alerts the moment they happen.
Any MCP client (Claude Desktop, Claude Code, your own agent) can connect to
POST /api/mcp as a stateless Streamable HTTP tool server. Without a token it
sees free/busy and booking only: get_availability, find_mutual_times,
create_booking. With Authorization: Bearer <MCP_TOKEN> it also gets the
private tools: get_schedule, list_calendars, create_event,
update_event, delete_event, create_personal_block, create_actionable,
list_actionables, update_actionable, delete_actionable, set_reminder.
Unauthenticated callers never see the private tool names. GET /api/mcp
shows which tools the caller can use, so a misconfigured token is obvious.
Actionables are day-scoped to-dos: list them for a range (timed and untimed,
with item ids and checked state; the end is exclusive), move or retime one
with update_actionable instead of creating a second copy (a timed one keeps
its time of day when moved by day alone; a re-sent to-do list keeps what is
already checked), and remove one with delete_actionable (irreversible; one
occurrence only for a recurring to-do; a copy carried over from an unfinished
day takes its unfinished earlier copies with it, or it would come back).
On someone else's Calendly page (Calendly's public demo above), every slot is badged with your own free/busy, pulled live from your deployment, so you never book yourself into a conflict.
Connect any number of Google and Outlook accounts (seven calendars, one place). The availability engine merges their free/busy into one view, the booking page offers only real openings, and confirmed bookings are written back to the calendar you choose.
%%{init: {"themeVariables": {"fontSize": "12px"}}}%%
flowchart TB
subgraph cal["Your calendars, any number"]
direction LR
G1["Google 1"]
G2["Google 2"]
G3["Google N"]
O1["Outlook 1"]
O2["Outlook N"]
end
cal --> AGG["Free/busy aggregation<br>merged in UTC"]
AGG --> AV["Availability engine<br>open slots, revalidated at booking time"]
AV --> BP["Public booking page"]
AV --> AG["Claude agent"]
AG --> WA["WhatsApp<br>control, alerts, reminders"]
AG --> EM["Email<br>confirmations, reminders"]
BP --> DEST["Destination calendar<br>event and invite written back"]
Booking, agents, reminders, and calendar extras (personal blocks, birthdays,
to-do lists) are plain JSON APIs under src/app/api/, so you can reuse them from any
client.
git clone https://github.com/hunterZh37/agentic-scheduling.git && cd agentic-scheduling
npm install
cp .env.example .env # defaults work out of the box
docker compose up -d # local Postgres
npx prisma migrate dev && npx prisma db seed
npm run dev # http://localhost:3000
The app boots fully on placeholder config, so you can click through the UI before connecting anything real. When you are ready to go live, docs/SETUP.md walks through each credential (Google, Microsoft, Anthropic, Twilio, Resend) one at a time, in any order.
All identity comes from environment variables: owner name, email, timezone, phone
numbers, and calendar credentials (see .env.example). The one file
with brand defaults baked in is
src/lib/booking/publicConfig.ts (practice name,
domain, consulting areas, research link). Edit it when deploying your own instance.
Everything is environment variables (see .env.example). No personal
data is hardcoded.
Next.js (App Router), React 19, and TypeScript on Vercel. Postgres via Prisma. Claude tool-calling for the agents. Twilio for SMS/WhatsApp, Resend for email, VAPID for web push. Luxon and rrule for time and recurrence. Vitest for tests.
Issues and PRs welcome. Run npm test and npm run lint before submitting.
MIT © Ze Dong (Hunter) Zhang