Click Below to Get the Code

Browse, clone, and build from real-world templates powered by Harper.
Tutorial
GitHub Logo

Building a Calendar and Scheduling App with Harper

This post is about using Harper's GraphQL capabilities to build an API for a calendar and scheduling backend with minimal code
Tutorial

Building a Calendar and Scheduling App with Harper

Nenne Nwodo
Developer Relations
at Harper
August 18, 2025
Nenne Nwodo
Developer Relations
at Harper
August 18, 2025
Nenne Nwodo
Developer Relations
at Harper
August 18, 2025
August 18, 2025
This post is about using Harper's GraphQL capabilities to build an API for a calendar and scheduling backend with minimal code
Nenne Nwodo
Developer Relations

Building calendar features turns into a mess fast. What starts as "just store some events" becomes Redis for caching, Kafka for real-time updates, and multiple services just to check if someone's free for a meeting.

You end up debugging why calendars aren't syncing instead of building the scheduling features users actually want.

Harper changes this. Everything runs in one process: database, cache, real-time updates, conflict detection. No network calls between services, no complex synchronization.

The Traditional Calendar Nightmare

Calendar systems get complex because of coordination between services. Your availability service needs to talk to your event service. Notifications need to sync with conflict detection. Time zones need to work across everything.

A simple "meeting time changed" notification becomes a distributed systems problem. Database updates, cache invalidation, real-time pushes, and hoping nothing fails halfway through.

Setting Up Your Calendar Schema

Harper uses GraphQL to define your data model and automatically generates REST endpoints:

type User @table @export {
  id: ID @primaryKey
  email: String @indexed
  name: String
  timezone: String
  createdAt: String @createdTime
}

type Event @table @export {
  id: ID @primaryKey
  title: String @indexed
  startTime: String @indexed
  endTime: String @indexed
  organizerId: ID @indexed
  organizer: User @relationship(from: organizerId)
  attendeeIds: [ID] @indexed
  attendees: [User] @relationship(from: attendeeIds)
  status: String @indexed
  createdAt: String @createdTime
}

type Availability @table @export {
  id: ID @primaryKey
  userId: ID @indexed
  dayOfWeek: Int @indexed
  startTime: String @indexed
  endTime: String @indexed
  isAvailable: Boolean @indexed
}

The @export directive creates REST endpoints at /User/, /Event/, and /Availability/. The @relationship directive handles joins automatically.

Simple Scheduling Operations

Create a meeting:

POST /Event/
Content-Type: application/json

{
  "title": "Product Review",
  "startTime": "2024-08-15T14:00:00Z",
  "endTime": "2024-08-15T15:00:00Z",
  "organizerId": "user123",
  "attendeeIds": ["user456", "user789"]
}

 

Get someone's calendar:

GET /Event/?organizerId=user123&startTime=gte=2024-08-01&sort=startTime

Check for conflicts:

GET /Event/?attendeeIds=user123&startTime=lt=2024-08-15T15:00:00Z&endTime=gt=2024-08-15T14:00:00Z

Everything happens in the same process. No network latency, no coordination complexity.

Real-Time Updates

Harper has WebSockets built in:

ws://localhost:9926/Event/user123

When someone accepts a meeting, all attendees see the update instantly. No message brokers needed.

Time Zone Handling

Store everything in UTC, handle conversion at query time:

GET /Event/?organizerId=user123&timezone=America/New_York&startTime=gte=2024-08-15

No separate timezone service, no complex conversion logic.

Why This Works

Harper's single-process architecture eliminates the coordination problems that make calendar systems complex. You get faster response times, automatic conflict detection, and real-time sync without managing multiple services.

You focus on building scheduling features instead of debugging distributed systems.

Building calendar features turns into a mess fast. What starts as "just store some events" becomes Redis for caching, Kafka for real-time updates, and multiple services just to check if someone's free for a meeting.

You end up debugging why calendars aren't syncing instead of building the scheduling features users actually want.

Harper changes this. Everything runs in one process: database, cache, real-time updates, conflict detection. No network calls between services, no complex synchronization.

The Traditional Calendar Nightmare

Calendar systems get complex because of coordination between services. Your availability service needs to talk to your event service. Notifications need to sync with conflict detection. Time zones need to work across everything.

A simple "meeting time changed" notification becomes a distributed systems problem. Database updates, cache invalidation, real-time pushes, and hoping nothing fails halfway through.

Setting Up Your Calendar Schema

Harper uses GraphQL to define your data model and automatically generates REST endpoints:

type User @table @export {
  id: ID @primaryKey
  email: String @indexed
  name: String
  timezone: String
  createdAt: String @createdTime
}

type Event @table @export {
  id: ID @primaryKey
  title: String @indexed
  startTime: String @indexed
  endTime: String @indexed
  organizerId: ID @indexed
  organizer: User @relationship(from: organizerId)
  attendeeIds: [ID] @indexed
  attendees: [User] @relationship(from: attendeeIds)
  status: String @indexed
  createdAt: String @createdTime
}

type Availability @table @export {
  id: ID @primaryKey
  userId: ID @indexed
  dayOfWeek: Int @indexed
  startTime: String @indexed
  endTime: String @indexed
  isAvailable: Boolean @indexed
}

The @export directive creates REST endpoints at /User/, /Event/, and /Availability/. The @relationship directive handles joins automatically.

Simple Scheduling Operations

Create a meeting:

POST /Event/
Content-Type: application/json

{
  "title": "Product Review",
  "startTime": "2024-08-15T14:00:00Z",
  "endTime": "2024-08-15T15:00:00Z",
  "organizerId": "user123",
  "attendeeIds": ["user456", "user789"]
}

 

Get someone's calendar:

GET /Event/?organizerId=user123&startTime=gte=2024-08-01&sort=startTime

Check for conflicts:

GET /Event/?attendeeIds=user123&startTime=lt=2024-08-15T15:00:00Z&endTime=gt=2024-08-15T14:00:00Z

Everything happens in the same process. No network latency, no coordination complexity.

Real-Time Updates

Harper has WebSockets built in:

ws://localhost:9926/Event/user123

When someone accepts a meeting, all attendees see the update instantly. No message brokers needed.

Time Zone Handling

Store everything in UTC, handle conversion at query time:

GET /Event/?organizerId=user123&timezone=America/New_York&startTime=gte=2024-08-15

No separate timezone service, no complex conversion logic.

Why This Works

Harper's single-process architecture eliminates the coordination problems that make calendar systems complex. You get faster response times, automatic conflict detection, and real-time sync without managing multiple services.

You focus on building scheduling features instead of debugging distributed systems.

This post is about using Harper's GraphQL capabilities to build an API for a calendar and scheduling backend with minimal code

Download

White arrow pointing right
This post is about using Harper's GraphQL capabilities to build an API for a calendar and scheduling backend with minimal code

Download

White arrow pointing right
This post is about using Harper's GraphQL capabilities to build an API for a calendar and scheduling backend with minimal code

Download

White arrow pointing right

Explore Recent Resources

Livestream
GitHub Logo

1.5 Hour Build - Vibe Coding a Full Personal Site: Design to Deployment in One Session

Watch Austin rebuild his personal website live using Claude AI and Harper, including a custom Markdown CMS, GraphQL schema design, React scaffolding, and full deployment. A real-time pair coding session from design to launch.
Livestream
Watch Austin rebuild his personal website live using Claude AI and Harper, including a custom Markdown CMS, GraphQL schema design, React scaffolding, and full deployment. A real-time pair coding session from design to launch.
Person with short hair wearing a light blue patterned shirt, smiling widely outdoors with blurred greenery and trees in the background.
Austin Akers
Head of Developer Relations
Livestream

1.5 Hour Build - Vibe Coding a Full Personal Site: Design to Deployment in One Session

Watch Austin rebuild his personal website live using Claude AI and Harper, including a custom Markdown CMS, GraphQL schema design, React scaffolding, and full deployment. A real-time pair coding session from design to launch.
Austin Akers
May 2026
Livestream

1.5 Hour Build - Vibe Coding a Full Personal Site: Design to Deployment in One Session

Watch Austin rebuild his personal website live using Claude AI and Harper, including a custom Markdown CMS, GraphQL schema design, React scaffolding, and full deployment. A real-time pair coding session from design to launch.
Austin Akers
Livestream

1.5 Hour Build - Vibe Coding a Full Personal Site: Design to Deployment in One Session

Watch Austin rebuild his personal website live using Claude AI and Harper, including a custom Markdown CMS, GraphQL schema design, React scaffolding, and full deployment. A real-time pair coding session from design to launch.
Austin Akers
Blog
GitHub Logo

The Old Product Loop Is the New Bottleneck

AI has made it dramatically cheaper to get software to a working version, but most companies still plan like building is the expensive part. The new bottleneck is the product loop: forming sharp hypotheses, living inside the user experience, fixing friction as it appears, and feeding evidence back into the roadmap faster than ticket-based planning allows.
Blog
AI has made it dramatically cheaper to get software to a working version, but most companies still plan like building is the expensive part. The new bottleneck is the product loop: forming sharp hypotheses, living inside the user experience, fixing friction as it appears, and feeding evidence back into the roadmap faster than ticket-based planning allows.
Person with short dark hair and moustache, wearing a colorful plaid shirt, smiling outdoors in a forested mountain landscape.
Aleks Haugom
Senior Manager of GTM
Blog

The Old Product Loop Is the New Bottleneck

AI has made it dramatically cheaper to get software to a working version, but most companies still plan like building is the expensive part. The new bottleneck is the product loop: forming sharp hypotheses, living inside the user experience, fixing friction as it appears, and feeding evidence back into the roadmap faster than ticket-based planning allows.
Aleks Haugom
May 2026
Blog

The Old Product Loop Is the New Bottleneck

AI has made it dramatically cheaper to get software to a working version, but most companies still plan like building is the expensive part. The new bottleneck is the product loop: forming sharp hypotheses, living inside the user experience, fixing friction as it appears, and feeding evidence back into the roadmap faster than ticket-based planning allows.
Aleks Haugom
Blog

The Old Product Loop Is the New Bottleneck

AI has made it dramatically cheaper to get software to a working version, but most companies still plan like building is the expensive part. The new bottleneck is the product loop: forming sharp hypotheses, living inside the user experience, fixing friction as it appears, and feeding evidence back into the roadmap faster than ticket-based planning allows.
Aleks Haugom
Livestream
GitHub Logo

2 Hour Build - Live Stream for Non-Developers

A non-developer's live stream walkthrough of building Flow State, a Colorado river-flow app for rafters, in two hours using ChatGPT dictation, Claude Code, Claude Design, and Harper. Scaffold with npm create harper@latest and deploy to Harper Fabric. No coding background required.
Livestream
A non-developer's live stream walkthrough of building Flow State, a Colorado river-flow app for rafters, in two hours using ChatGPT dictation, Claude Code, Claude Design, and Harper. Scaffold with npm create harper@latest and deploy to Harper Fabric. No coding background required.
Person with short dark hair and moustache, wearing a colorful plaid shirt, smiling outdoors in a forested mountain landscape.
Aleks Haugom
Senior Manager of GTM
Livestream

2 Hour Build - Live Stream for Non-Developers

A non-developer's live stream walkthrough of building Flow State, a Colorado river-flow app for rafters, in two hours using ChatGPT dictation, Claude Code, Claude Design, and Harper. Scaffold with npm create harper@latest and deploy to Harper Fabric. No coding background required.
Aleks Haugom
May 2026
Livestream

2 Hour Build - Live Stream for Non-Developers

A non-developer's live stream walkthrough of building Flow State, a Colorado river-flow app for rafters, in two hours using ChatGPT dictation, Claude Code, Claude Design, and Harper. Scaffold with npm create harper@latest and deploy to Harper Fabric. No coding background required.
Aleks Haugom
Livestream

2 Hour Build - Live Stream for Non-Developers

A non-developer's live stream walkthrough of building Flow State, a Colorado river-flow app for rafters, in two hours using ChatGPT dictation, Claude Code, Claude Design, and Harper. Scaffold with npm create harper@latest and deploy to Harper Fabric. No coding background required.
Aleks Haugom
Tutorial
GitHub Logo

Production Quality at Vibe Code Velocity: Dispatched Agent Teams with Harper

Harper enables production-grade agentic engineering by collapsing database, cache, runtime, and messaging into one process, reducing agent complexity and review burden. A multi-model dispatch workflow lets specialized agents plan, code, QA, and review in parallel while humans retain control over critical decisions.
Tutorial
Harper enables production-grade agentic engineering by collapsing database, cache, runtime, and messaging into one process, reducing agent complexity and review burden. A multi-model dispatch workflow lets specialized agents plan, code, QA, and review in parallel while humans retain control over critical decisions.
Person with very short hair and a goatee wearing a plaid button‑up shirt over a white undershirt, smiling outdoors with leafy greenery behind.
Jeff Darnton
SVP, Professional Services & Customer Success
Tutorial

Production Quality at Vibe Code Velocity: Dispatched Agent Teams with Harper

Harper enables production-grade agentic engineering by collapsing database, cache, runtime, and messaging into one process, reducing agent complexity and review burden. A multi-model dispatch workflow lets specialized agents plan, code, QA, and review in parallel while humans retain control over critical decisions.
Jeff Darnton
May 2026
Tutorial

Production Quality at Vibe Code Velocity: Dispatched Agent Teams with Harper

Harper enables production-grade agentic engineering by collapsing database, cache, runtime, and messaging into one process, reducing agent complexity and review burden. A multi-model dispatch workflow lets specialized agents plan, code, QA, and review in parallel while humans retain control over critical decisions.
Jeff Darnton
Tutorial

Production Quality at Vibe Code Velocity: Dispatched Agent Teams with Harper

Harper enables production-grade agentic engineering by collapsing database, cache, runtime, and messaging into one process, reducing agent complexity and review burden. A multi-model dispatch workflow lets specialized agents plan, code, QA, and review in parallel while humans retain control over critical decisions.
Jeff Darnton
Tutorial
GitHub Logo

Change Data Capture Into a Runtime: One Pipeline for Pages, Search, and AI Agents

Learn how Harper turns CDC streams into real-time workflows that refresh cached pages, update search indexes, and keep AI agent context current. See why landing changes in an application runtime beats warehouses, queues, and traditional CDNs.
Tutorial
Learn how Harper turns CDC streams into real-time workflows that refresh cached pages, update search indexes, and keep AI agent context current. See why landing changes in an application runtime beats warehouses, queues, and traditional CDNs.
Person with very short hair and a goatee wearing a plaid button‑up shirt over a white undershirt, smiling outdoors with leafy greenery behind.
Jeff Darnton
SVP, Professional Services & Customer Success
Tutorial

Change Data Capture Into a Runtime: One Pipeline for Pages, Search, and AI Agents

Learn how Harper turns CDC streams into real-time workflows that refresh cached pages, update search indexes, and keep AI agent context current. See why landing changes in an application runtime beats warehouses, queues, and traditional CDNs.
Jeff Darnton
May 2026
Tutorial

Change Data Capture Into a Runtime: One Pipeline for Pages, Search, and AI Agents

Learn how Harper turns CDC streams into real-time workflows that refresh cached pages, update search indexes, and keep AI agent context current. See why landing changes in an application runtime beats warehouses, queues, and traditional CDNs.
Jeff Darnton
Tutorial

Change Data Capture Into a Runtime: One Pipeline for Pages, Search, and AI Agents

Learn how Harper turns CDC streams into real-time workflows that refresh cached pages, update search indexes, and keep AI agent context current. See why landing changes in an application runtime beats warehouses, queues, and traditional CDNs.
Jeff Darnton