Quick answer
Nori is an AI coding agent you work with in Slack. Mention @nori in any thread with a task. Nori starts an isolated cloud machine with your repositories and team instructions, plans the change, writes and tests the code, and replies in the thread with a pull request link. Anyone in the thread can follow up, attach files, or ask for changes, and the same agent keeps working until the pull request is ready for review.
What a Slack coding agent does for a team
Most engineering requests already start in Slack: a bug report in a support channel, a question in a pull request thread, a product manager asking whether a change is hard. A Slack coding agent turns that message into finished work without anyone copying it into a terminal.
With Nori, the thread is the session. The request, the plan, the progress updates, the pull request link and the review follow-ups all stay in one place that the whole team can read.
- Anyone can ask. Engineers, product managers, support and data people mention the same agent. Engineers still review what ships.
- Work continues without you. The agent runs on a cloud machine, so it keeps going when you close your laptop or leave for a meeting.
- Many tasks at once. Each thread gets its own machine. Five threads means five agents working in parallel, each on its own branch.
- One shared way of working. Every session starts with your organization's skillset and shared memories, so the agent follows your branch naming, test commands and review rules without being told again.
How it works
Install the Nori Slack app, connect GitHub, and choose the repositories every session should start with. After that, each request follows the same path.
- Mention. Someone writes
@noriand a task in a channel or thread. Nori reads the whole thread, so a mention at the bottom of a long bug discussion already has the context. - Machine. Nori claims an isolated cloud machine with your repositories cloned, your setup script run, and your organization's skillset and memories installed.
- Plan. For anything beyond a small fix, the agent researches the code and posts a short plan in the thread. You approve it or correct it in plain language.
- Code and test. The agent writes a failing test first, makes it pass, and runs the checks your repository defines. It posts progress updates in the thread as it goes.
- Pull request. The agent pushes a feature branch, opens a pull request, and replies with the link and a short summary of what changed and how it was tested.
- Follow-ups. Reply in the thread to ask for changes. The same session picks up the message with everything it already knows. When the work is finished, reply
!doneand the machine is released.
The agent on the machine is Jiro, Nori's own engineering teammate, or any harness your team prefers: Claude Code, Codex, Gemini CLI, Cursor, OpenCode, Droid, Amp or any ACP agent. It runs on your own Claude or ChatGPT subscription, API keys or LLM gateway. Nori never charges for tokens.
A worked example: one bug, one thread, one pull request
Here is a thread from a support channel, shortened. The names and numbers are illustrative.
#support-escalations
Priya 10:02
Customer says the invoice CSV export is missing rows for March.
Screenshot and their export attached.
[invoice-export-march.csv] [screenshot.png]
Daniel 10:05
@nori can you look at this? The export lives in billing-api.
Fix it and add a test.
Nori 10:06
On it. Reading the thread and the attached CSV.
Nori 10:11
Found it. `export_invoices()` in billing-api/exports/csv.py joins
invoices to regions with an inner join, so invoices with a null
region_id are dropped. 14 rows in the attached file's date range
are affected in the test fixture.
Plan:
1. Add a failing test with a null-region invoice.
2. Change the join to a left join and write an empty region column.
3. Run the billing-api test suite.
Go ahead?
Daniel 10:12
Yes. Write "Unassigned" instead of an empty region.
Nori 10:24
PR opened: billing-api #482 "Include invoices without a region
in CSV export"
- New test: test_export_includes_null_region
- Region column shows "Unassigned" when region_id is null
- 212 tests pass
Daniel 10:40
@nori reviewer asked for the label to come from settings,
not a string literal.
Nori 10:46
Pushed a follow-up commit. The label now reads
EXPORT_UNASSIGNED_REGION_LABEL from settings. Tests pass.
Daniel 11:02
Merged. !done
Three things in that thread are worth noticing.
- The agent read the files. The CSV and the screenshot were attached two messages before the mention. Nori reads uploads in the thread, so nobody had to describe them.
- The plan was corrected in one line. Daniel changed the behavior before any code was written, which is cheaper than a review comment afterwards.
- The follow-up needed no new context. The second mention went to the same session, on the same branch, with the same understanding of the bug.
Threads, files and projects
Threads
One thread is one conversation with one agent. Messages in the thread reach that agent; messages in other threads start separate sessions on separate machines. If people want to talk in a thread without the agent answering every message, they can switch it to reply only when tagged.
File uploads
Attach logs, screenshots, CSV files, PDFs or design exports to the thread. The agent downloads them to its machine and works with them directly. It can also upload results back: a chart, a generated report, or a screenshot of the page it just changed.
Projects
Work that spans many threads or many days belongs in a project. A project has a coordinator that remembers the goal, shared reference documents, and subworkers that take individual tasks. A thread that belongs to a project starts with the project's context, so you do not explain the migration plan again in every request.
Credentials, custom agents and control
A shared agent is only useful if it acts with the right permissions for the person who asked.
- Per-person credentials. Integrations are scoped to the organization, to one person, or to one agent. A session started by Daniel can use Daniel's own connections, and pull requests can be attributed to the person who asked for them.
- Custom agent handles. Give a team its own agent with its own handle, model, skillset and integrations. A data team might mention a data agent that knows dbt and the warehouse; the platform team mentions one that knows Terraform. Each is one mention away in the same Slack workspace.
- Any MCP server. Connect Linear, Sentry, Notion or an internal server once and every session can use it.
- Isolation. Each session runs in its own sandbox and gets only what it was given. Admins see every session the organization has run.
- Enterprise deployment. The full stack, control plane included, deploys into your own AWS VPC or Azure VNet, or on-prem, with SAML, SCIM and OIDC. Hosted customers get a dedicated, single-tenant control plane and data store.
The same agent also works on Discord, in the browser and from the CLI, and it can start without a person at all. See scheduled coding agents for cron, reminders and webhooks, and how a Sentry webhook becomes a fix pull request for an end-to-end example.
What to ask it first
Good first requests are small, testable and easy to review. These are messages teams send in their first week.
@nori why does the nightly import skip files larger than 50 MB? Point me at the code.@nori the signup form accepts emails with trailing spaces. Fix it and add a test.@nori bump eslint to the latest major in web-app and fix what breaks. One PR.@nori read this stack trace and tell me which deploy introduced it.@nori write the migration for the plan above, but do not open a PR until I look at the SQL.
Questions are as useful as changes. An answer with file paths and line references, from an agent that has the repository checked out, is often faster than finding the person who wrote the code.
Frequently asked questions
Does the Slack coding agent open real pull requests?
Yes. The agent works on a cloud machine with your repositories cloned, pushes a feature branch, and opens a pull request through the Nori GitHub app. It replies in the Slack thread with the link and a summary. Your normal review and merge rules still apply.
Can people who are not engineers use it?
Yes. Anyone you allow in the Slack workspace can mention the agent to ask a question about the codebase or request a small change. They do not install anything. The result is a pull request that an engineer reviews before it merges.
Which model and agent does it use?
By default it runs Jiro, Nori's own agent, on Claude Code or Codex. You can also run Gemini CLI, Cursor, OpenCode, Droid, Amp or any ACP agent. All of them use your own Claude or ChatGPT subscription, API keys or LLM gateway.
What does it cost?
Nori has a 30-day free trial with no card. Developer is $99 per month for one person and three machines. Team starts at $250 per month for five machines and unlimited members. Nori never charges for tokens, because you connect your own subscription or keys.
What happens when two people reply in the same thread?
Both messages go to the same agent session, in order, so the agent sees one conversation. Each thread has one session and one machine. To run separate tasks in parallel, start separate threads, and each one gets its own machine and branch.
Can the agent read screenshots and files attached in Slack?
Yes. Files uploaded to the thread, such as logs, CSV exports, PDFs and screenshots, are downloaded to the session machine and read by the agent. It can also upload files back to the thread, for example a chart or a screenshot of a changed page.