Quick start

We'll build a daily-standup generator: it reads your git log, pulls your in-progress tasks, and writes a three-line summary to a file. Everything stays local. No Discord setup, no OAuth, no external integrations.

If you already have an LLM provider you use, you can skip ahead to Configure the agent.

1. Install

bash
npm install -g @tailored-ai/cli
tai init

The setup wizard creates ~/.tailored-ai/config.yaml, probes the provider you choose, and writes a starter .env. If you'd rather install as a project dependency or embed the runtime in your own service, see Installation.

2. Pick a provider

TAI doesn't ship a model. Bring whichever you already use.

Local (Ollama, vLLM, LM Studio)

The built-in openai_compatible provider works with anything that speaks the OpenAI chat API. The setup wizard can configure it for you. To edit the generated config by hand after installing Ollama and pulling a model:

yaml
providers:
  openai_compatible:
    baseUrl: http://localhost:11434/v1
    defaultModel: llama3.2

agent:
  defaultProvider: openai_compatible

Hosted

Hosted vendors ship as plugins:

bash
tai plugin install @tailored-ai/provider-anthropic
yaml
providers:
  anthropic:
    apiKey: ${ANTHROPIC_API_KEY}
    defaultModel: claude-haiku-4-5

agent:
  defaultProvider: anthropic

Put the provider block in ~/.tailored-ai/config.yaml and its API key in the .env beside it. Other providers have different fields—Bedrock, for example, uses the AWS credential chain. Configure a model provider has the shortest working path for each supported option.

3. Configure the agent

Add this below the providers block in ~/.tailored-ai/config.yaml:

yaml
agents:
  reporter:
    instructions: |
      You write daily standups. Three bullets: yesterday, today, blockers.
      Be specific. Don't pad.
    tools: [exec, write, tasks]

tools:
  exec: { enabled: true, allowedCommands: [git, date] }
  write: { enabled: true }
  tasks: { enabled: true }

The agent is now constrained to three tools: exec (with a tight command allowlist), write (to save the standup), and tasks (to read your in-progress work).

4. First run

From any git repository:

bash
tai -a reporter -m "Generate today's standup. Use git log to see what changed yesterday, pull in-progress tasks, then write the standup to standup.md."

The agent runs the tools, writes standup.md, and prints what it did. That file is real. You can cat standup.md and see a standup.

This is the part that's different from talking to ChatGPT. The agent chose to call git log, parsed it, wrote a file. It didn't show you the commands. It just did the work.

5. Make it run on a schedule

Add a cron block to the same config.yaml:

yaml
cron:
  enabled: true
  jobs:
    - name: daily-standup
      schedule: "0 8 * * 1-5"   # weekdays, 8am
      agent: reporter
      prompt: |
        Generate today's standup. Run git log for the past day, pull
        in-progress tasks, and write the result to ~/standup.md.
      delivery:
        channel: log

Run tai (with no arguments). It starts the HTTP API, the cron scheduler, and the Discord bot if you've configured it. The job fires at 8am every weekday and the standup lands at ~/standup.md.

To test the schedule without waiting until tomorrow, change 0 8 * * 1-5 to */2 * * * * (every two minutes), restart tai, and watch the file appear.

6. Pick a place for it to land

By default the response goes to the process log. To send it through a connected channel, set the channel id, delivery mode, and destination:

  • delivery.channel: log — stdout/log file. Good for cron jobs whose side effect is the point (the standup file already exists; the delivery is just confirmation).
  • delivery: { channel: discord, mode: dm } — DMs the configured Discord owner. Add target to choose another user.
  • delivery: { channel: slack, mode: channel, target: C01234567 } — posts to a Slack channel when the Slack plugin is installed and connected.

Add Discord

yaml
channels:
  discord:
    enabled: true
    token: ${DISCORD_BOT_TOKEN}
    owner: ${DISCORD_OWNER_ID}
    respondToDMs: true
    respondToMentions: true

Now the standup arrives as a DM every weekday morning, and you can chat with the same named agent from Discord. Each channel keeps its own conversation session while tasks, projects, and memory remain available through shared persistent state.

Slack ships as the @tailored-ai/channel-slack plugin. Other transports can register the same channel interface; see Plugins and Extending in code.

7. Pick a place to view it

tai ships a web UI at http://localhost:3000. It gives you a chat sidebar, an agent picker, a session list, and views for tasks, memory, workflows, resources, and runtime activity. To run headless, set server.ui.enabled: false.

If you'd rather build your own UI, the runtime's full surface is available over HTTP (see @tailored-ai/server). The bundled UI is one consumer of that API, not the only one.

What you have now

One home directory with your config and persistent state. An agent that runs every morning, looks at the current repository, and writes a useful artifact. A way to chat with it on any of the channels you've enabled.

Where to go from here

  • More agents. Define a researcher for web search, a coder for worktree-based code work, a planner for calendar review. See Agents.
  • More tools. Wrap a shell command as a custom tool in YAML: Custom tools. Write a TypeScript tool: Extending in code.
  • More workflows. Multi-step pipelines with conditions and parallel fan-out: Workflows.
  • Memory. Persistent recall across sessions, with embeddings and promotion: Memory.