Example Apps

Complete, runnable Grove applications covering common patterns. Each example is a standalone module that passes grove-cli check and includes tests.

What you'll learn: How real Grove applications are structured, from simple CRUD to multi-entity workflows.

Todo App

A task tracker with state machine transitions (open -> in_progress -> done), validation, and full test coverage.

Features demonstrated: record, events, actions, @create, @delete, enum, state machine, invariant, reusable validate, inline validate, tests.

manzano check examples/apps/todo
manzano test examples/apps/todo

See the 5-Minute Tutorial for a step-by-step walkthrough of this app.

Pet Store

A pet adoption service with custom types, composite fields, optional types, and a multi-step lifecycle.

Features demonstrated: custom type, nested types, optional fields (T?), List<T>, functions, multiple state transitions, @lookup annotation.

See Build a Pet Adoption Service for the tutorial.

Issue Tracker

A project issue tracker with assignees, labels, comments, and priority levels.

Features demonstrated: multiple actions, list manipulation (.append(), .filter()), computed values in events, conditional logic in apply blocks.

Shopping Cart

An e-commerce shopping cart with line items, quantity updates, and checkout.

Features demonstrated: child record patterns, computed totals with .map() and .sum(), multi-event actions.

Blog CMS

A content management system with articles, drafts, publishing workflow, and categories.

Features demonstrated: rich state machine (draft -> review -> published -> archived), string manipulation, date fields.

Running Examples

All examples follow the same structure:

examples/apps/<name>/
  grove.toml           # project_id
  module.grove         # Main module
  <name>_test.grove    # Tests
  request_*.json       # Sample requests

To run any example:

# Type-check
manzano check examples/apps/<name>

# Run tests
manzano test examples/apps/<name>

# Execute an action
manzano run examples/apps/<name> \
  --request examples/apps/<name>/request_create.json

# Execute with database persistence
manzano run-db examples/apps/<name> \
  --request examples/apps/<name>/request_create.json \
  --backend sqlite --db /tmp/grove-example.sqlite

See Also