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
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:
providers:
openai_compatible:
baseUrl: http://localhost:11434/v1
defaultModel: llama3.2
agent:
defaultProvider: openai_compatible
Hosted
Hosted vendors ship as plugins:
tai plugin install @tailored-ai/provider-anthropic
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:
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:
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:
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. Addtargetto 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
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
researcherfor web search, acoderfor worktree-based code work, aplannerfor 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.