Quick Start

Build and deploy a todo API to AWS in under 5 minutes.

1. Create a project

npm create notation@alpha my-app
cd my-app
npm install
my-app/
├── infra/
│   └── api.ts
├── runtime/
│   └── todos.fn.ts
├── package.json
└── tsconfig.json

2. Explore the code

The starter template gives you two directories: infrastructure and runtime.

infra/api.ts – defines the API Gateway and routes:

import { api, router } from "@notation/aws/api-gateway";
import { getTodos, getTodoCount } from "runtime/todos.fn";

const todoApi = api({ name: "todo-api" });
const todoRouter = router(todoApi);

todoRouter.get("/todos", getTodos);
todoRouter.get("/todos/count", getTodoCount);
import type { LambdaConfig } from "@notation/aws/lambda.fn";
import { handle, json } from "@notation/aws/lambda.fn";

export const getTodos = handle.apiRequest(() => {
  return json([{ id: 1, text: "Learn Notation" }]);
});

export const getTodoCount = handle.apiRequest(() => {
  return json(1);
});

export const config: LambdaConfig = {
  service: "aws/lambda",
  timeout: 5,
  memory: 64,
};

Infrastructure and runtime live in the same codebase. The router wires Lambda handlers to API Gateway routes, and Notation infers the intermediate resources – IAM roles, permissions, integrations, and so on.

3. Visualize the graph

npm run viz
✔ Compiled infra/api.ts → 12 resources
→ https://notation.dev/viz/abc123

Opens a Mermaid chart of the resource graph. This is what Notation will deploy.

4. Deploy

npm run deploy
✔ Compiled infra/api.ts → 12 resources
✔ Diffed against state → 12 to create, 0 to update, 0 to destroy
✔ Deploying...

  ✔ iam-role/getTodos-role          created
  ✔ iam-role/getTodoCount-role      created
  ✔ lambda/getTodos                 created
  ✔ lambda/getTodoCount             created
  ✔ api-gateway/todo-api            created
  ✔ route/GET /todos                created
  ✔ route/GET /todos/count          created
  ✔ integration/getTodos            created
  ✔ integration/getTodoCount        created
  ...

✔ Deployed 12 resources

  GET https://abc123.execute-api.us-east-1.amazonaws.com/todos
  GET https://abc123.execute-api.us-east-1.amazonaws.com/todos/count

Notation compiles your infrastructure, diffs it against the current state, and deploys resources in dependency order. On first deploy, everything is created.

curl https://abc123.execute-api.us-east-1.amazonaws.com/todos
[{ "id": 1, "text": "Learn Notation" }]

5. Make a change

Edit the handler in runtime/todos.fn.ts:

runtime/todos.fn.ts
export const getTodos = handle.apiRequest(() => {
  return json([
    { id: 1, text: "Learn Notation" },
    { id: 2, text: "Ship it" },
  ]);
});

Then start watch mode:

npm run watch
✔ Watching infra/api.ts...
✔ runtime/todos.fn.ts changed
✔ Recompiled → 1 resource changed
✔ lambda/getTodos                 updated

  Ready.

Notation recompiles the graph and redeploys only the resources that changed.

6. Tear down

npm run destroy
✔ Compiled infra/api.ts → 12 resources
✔ Destroying in reverse dependency order...

  ✔ integration/getTodoCount        destroyed
  ✔ integration/getTodos            destroyed
  ✔ route/GET /todos/count          destroyed
  ✔ route/GET /todos                destroyed
  ✔ api-gateway/todo-api            destroyed
  ✔ lambda/getTodoCount             destroyed
  ✔ lambda/getTodos                 destroyed
  ✔ iam-role/getTodoCount-role      destroyed
  ✔ iam-role/getTodos-role          destroyed
  ...

✔ Destroyed 12 resources

Everything is removed in reverse dependency order.