商业产业 Hacker News AI 2026-10-25T16:45 正文 ok 2428 words

开源 AI 初级工程师 Junior:运行在 Mac 本地,专为资深工程师打造的智能助手

英文标题:🔶 Show HN: Junior – an open-source AI junior engineer that runs on your Mac

开源项目 Junior 是一款专为 Mac 设计的 AI 初级工程师工具,旨在协助资深工程师与技术主管处理繁琐的日常研发流程。它能够监控 GitHub、Slack、Linear 等协作平台并按优先级智能排序,自动承担修复 CI 故障、起草消息回复及依赖更新等杂务。该项目直接复用开发者已有的 Claude Code 或 Codex 订阅与本地登录态,无需额外配置 API Key 且无第三方费用,所有外发操作均需人类确认。Junior 展示了一种高掌控度、注重隐私保护的本地化 AI Agent 研发协作新范式。
打开原文相关 2 · 机会 2
media2.7 KB media187.3 KB media1.3 KB media1.3 KB media1.3 KB media1.3 KB media220.9 KB media36.2 KB

中文

Junior。运行在你的 Mac 上。任何内容外发前必先询问。为资深工程师打造的初级工程师。Junior 监控 GitHub、Slack、Linear 以及你的其他工具,将需要你的事项呈送给你。免费、开源、本地运行。Junior 的形象是一个用点阵绘制的浅紫色钥匙,立在右侧的点状山脊上。

安装 · 工作原理 · 运作准则 · 功能特性 · 常见问题 · 开发指南 · 官方网站

最新版本 macOS,Apple 芯片或 Intel 基于 Claude Code 与 Codex 运行 最后提交

运行在你的 MAC 上。任何内容外发前必先询问。

专为资深工程师打造的初级工程师

Junior 实时关注 GitHub、Slack、Linear 以及你的其他工具。它把真正需要你的事项呈送给你;接手其余杂务,并且在任何内容对外发送之前都会征求你的意见。它运行在你的 Mac 本地,逐渐熟悉你的工作习惯,每周需要你操心的事情都会少一点。

bash curl -fsSL https://usejunior.sh/install.sh | sh

为 macOS(Apple 芯片或 Intel)安装 Junior.app。建议先阅读 install.sh 脚本,换做是我们也会这么做。

在 2026 年 10 月之前,Junior 曾被命名为 Triage。同样的应用,现在统一为一个名字。从 Triage 升级时,首次启动会将你的数据从 ~/.triage 迁移至 ~/.junior。

工作任务来自 GitHub、Slack、Linear 和 Sentry。收件箱对其进行排序:两行需要你处理,三行交由 Junior。Junior 修复 CI 并起草回复,然后保留推送和回复等待你的确认。未经许可外发数:0。

示例工作流。你的周二日常通常会有更多类似事项。

Junior 把需要你的事留给你,剩下的全由它搞定。 在你的 Mac 上运行,依托你的工具,且任何内容外发前必先询问。

  • 只留需要你的事。 GitHub、Slack、Linear 以及任何带有 MCP 服务的工具,汇聚在一个按优先级排序的列表中。每项都会注明为何出现。正在等待你的人会被排在最顶部。
  • Junior 接管其余工作。 Junior 负责修复 CI、重试并等待构建完成;起草回复并按既定计划执行日常杂务。只有经你批准后,内容才会外发。
  • 你的 Mac,你的订阅计划。 Junior 运行在你的 Mac 本地,使用你已付费的 Claude Code 或 Codex 套餐。无需粘贴任何 API Key,也绝无来自我们的账单。

收件箱中的每一行,要么属于你,要么属于 Junior。

今天的你 改变了什么 归谁处理
“我得查五个工具才能找到需要我处理的事情。” 一个排序列表,每项都标明原因。 你,效率倍增
“同事在等我,而我还在费劲排查信息。” 正在等待你的人直接置顶。 你,效率倍增
“我毫无准备地打开 PR 和工单。” 请求生成摘要,带着完整上下文开始。 你,效率倍增
“我不得不全程盯紧 PR 和 CI。” Junior 负责修复、重试并等待 CI。只有经你批准后才推送。 Junior
“我每周都在重复做同样的日常琐事。” Junior 按既定计划自动执行。 Junior
“我总是在反复敲出千篇一律的回复和进展更新。” Junior 自动起草,静候你的确认。 Junior

只需三步。其中一步是阅读 Shell 脚本。

01 · 安装 Mac 应用。 在终端运行一行命令。应用目前尚未公证(Notarized),因此建议先阅读 install.sh。换做是我们也会这么做。

bash $ curl -fsSL https://usejunior.sh/install.sh | sh → Junior.app installed → junior, junior-mcp in ~/.local/bin

02 · 连接你的工具。 开箱即支持 GitHub 和 Slack。任何带有 MCP 服务的工具均可通过配置任务接入。Junior 直接复用你已有的登录状态。

03 · 把剩下的交给 Junior。 一句话即可,无需长篇大论。Junior 会向你复述确认、拟定计划,然后开始工作。外发任何内容都需你批准。

你: 把依赖升级一下,跟上周一样。
Junior: 仅升级 Patch 小版本,PR 等待你审核。与上周保持一致。

从交接到完成的完整流程

没有你的同意,任何内容都不会外发。Junior 会先规划,并在任何外发操作前征询意见。

  1. 一句话即可交接。 给出一个指示,不用长篇大论。例如“修复 #498 中的不稳定测试(Flaky test)”就足够了。Junior 会自行调出 PR、日志和提交历史。
  2. Junior 复述确认并一次性问清。 它在一条消息中提出所有所需信息,每个问题都会附带其建议答案。通常你只需回复“好的”。
  3. 动代码前先做计划。 你可以像审查 PR 一样审查计划。如果是修复错别字之类的小任务则会跳过此步,毕竟没人需要为改个错字写份规划。
  4. Junior 在你的 Mac 本地干活。 编辑、测试和本地 Commit 不需要你的确认。在得到你的指令前,它们都会完整保留在你的本地机器上。
  5. 你来批准外发内容。 代码推送(Push)、PR、评论和消息均会逐字等待你的确认。Junior 绝不会擅自在 #general 频道发帖——它根本没有这个权限。

三条无法关闭的硬性规则。 你可以给它改名,更改它的语气,但这些规则永不变更:

  1. 它会复述你的需求。 在开始之前,它会用一两句话说明自己的理解。一次理解偏差只消耗一条消息的时间,而不是搭进去一整个下午。
  2. 在一条消息中问清全部问题。 不会像挤牙膏一样反复提问。一次性发完所有问题,并且每个问题都会附上建议答案。通常你只需确认即可。
  3. 未经许可,任何内容不得外发。 推送、PR、评论、工单状态流转以及沟通消息,都会逐字等待你的批准。但本地编辑、测试和本地提交无需反复确认。

你: 升级 api 仓库的依赖。
Junior: 复述确认:在 acme/api 中升级 patch 和 minor 版本,提交一个 PR,以测试全部通过为前提。

其余工作:从收件箱到最终推送之间会发生什么。

功能模块 说明
收件箱(Inbox) GitHub、Slack、Linear 以及任何带有 MCP 服务的工具,汇聚成一个排序列表。每项都标明原因。等待你的人直接置顶。排序遵循明确的规则,而非依赖大模型的心情。
今日概览(Today) 你的早晨已被整理井井有条。Junior 的晨间简报和共享日程规划:哪些属于你,哪些属于 Junior,哪些已经逾期。
目标(Goals) 交付目标而非步骤。告诉 Junior 完成标准(done-when)。它会自动等待 CI 和 Reviewer、修复重试,并在达到预算上限时停下。
定时任务(Jobs) 自动完成的日常杂务。通过与 Junior 聊天即可建立周期性任务。在正式启用前,每项任务都会进行一次试运行。
处理评审细则(Review nits) 自动清理 PR 评论中的小挑剔。它会读取你 PR 下的 Review 意见,做出相应更改,并在推送前向你展示 Diff。
自动起草回复(Replies) 同样的答案,更少的按键。Junior 替你起草回复,静候你的批准。
上下文简报(Briefs) 绝不毫无准备地打开 PR。请求生成一份简报,从完整上下文中开始。它会通读 Diff、讨论帖和提交历史,并告诉你最先关注哪里。
日志(Log) 每次外发操作都会以卡片形式等待你逐字确认。日志中清楚记录了发送了什么以及由谁授权。
工作会话(Sessions) 完整的 Claude Code 对话、Codex 聊天,以及同一工作空间中的真实终端。Junior 可以在可供你观察的浏览器窗格中检验其 UI 成果。
凭据追踪(Receipts) 每次自动化运行都是一个可以随时打开的会话。“未发现异常”意味着它认真排查后确实一无所获。
工作空间(Workspaces) 工作与个人事项严格隔离:独立的收件箱、任务集、连接器与 Claude 登录态。

它的头像表情表明了当前状态。 八种表情对应八种状态。如果它看起来有些担忧,说明有事项需要你介入。

表情 代表含义
问候(Hello) 当前没有任何事需要你操心。
倾听(Listening) 你在打字,它在阅读。
思考(Thinking) 正在阅读 PR、日志和讨论帖。
工作中(Working) 正在处理,尚未有任何内容离开你的 Mac。
需要你(Needs you) 提出一个问题,并附带它建议的选项。
完成(Done) 任务完成。所有待发送内容正在等待你的确认。
卡住了(Stuck) 遇到故障。它会明确指出问题所在,而不是胡乱猜测。
休眠(Asleep) 你的 Mac 处于睡眠状态,Junior 同样休眠。

随着时间推移,Junior 会接手端到端的工作。 Junior 从打杂跑腿开始。随着对你工作方式的熟悉,它在每项任务中承担的比重会越来越高,直至能够独立完成从 Issue 到 PR 合并的全流程。

流程步骤 第 1 天(当前) 几周后 · 计划中 未来 · 计划中
发现 Issue Junior Junior Junior
编写修复补丁 Junior 编写,你审查 Diff Junior 编写,你快速浏览 Diff Junior
提交 PR Junior 起草,你批准 Junior,在你的规则框架内 Junior
使 CI 变绿 Junior 修复 CI,你批准回复 Junior Junior
合并 你 你 Junior,针对已充分信任的任务

目前仅实现了第 1 天的功能。另外两列为规划蓝图,正如表格所示。

只有当你明确授权时,Junior 才会跨入下一阶段。它会依据自己的历史表现向你申请:

你此前未经修改直接批准了我提交的最近 12 个依赖项 PR。希望让我今后自行合并这些 PR 吗?

目标受众

资深工程师、Staff 工程师,以及仍需编写代码的技术负责人。他们每天使用 Claude Code 或 Codex,在 Mac 上工作,并且有团队成员经常等待他们的反馈。

暂不适用群体: 希望拥有一整套云端共享 Agent 集群的团队、希望 AI 无需人类审核即可肆意执行的用户,以及非 Mac 平台用户。

这些限制最好在安装前明确,而不是安装后再发现。

深入解答(FAQ)

官网仅提供简短答复,以下是详尽解答。

Junior 会冒充我发言吗?
未经你的许可绝不会。PR、评论、工单状态流转和聊天消息都会呈现在卡片上,逐字等待你的确认。编辑、测试和本地提交无需该许可,因为它们始终停留在你的 Mac 本地。只有两件事无需卡片确认即可执行,因为此时其他人尚不可见:推送到你自己的分支,以及创建 Draft PR(草稿 PR)。向默认分支推送代码则像所有外发动作一样必须等待确认,普通的 Force Push 也是如此。涉及销毁工作成果的命令始终会征询确认。

你也可以提前配置某类外发授权:指定某个人、某种外发类别。例如:“当 PR 准备就绪时,Junior 可以向 Priya 发送私信。”Junior 会通过卡片提议此类授权,你可以在 Settings → Approvals 中添加或撤销。

Junior 会取代我吗?
它在推送分支之前都得向你请示,大可放心。

Junior 是一个独立的 AI 大模型吗?
不是。Junior 实际是基于你的登录凭据运行的 Claude Code,或者是用于对话的 Codex。名称、外观界面和这些硬性规则由我们构建。

我的 Mac 休眠时它还能工作吗?
不能。Junior 运行在你的 Mac 本地,休眠时它也会停止,就像我们人类一样。Mac 重启后 Junior 会自动重新启动。无法运行的计划任务会被记录为“已错过”,而绝不会静默丢失。关闭窗口也不会让它停止运行,系统的 LaunchAgent 会维持服务常驻。

运行环境有什么要求?
一台 Mac(Apple 芯片或 Intel 均可)。安装好 Claude Code 并保持已登录状态。Codex 同样支持对话。详尽要求见“安装”章节。

它可以监控哪些工具?
开箱即支持 GitHub 和 Slack。Linear、Sentry、Notion 或任何带有 MCP 服务的工具都可以通过创建任务接入。你只需与 Junior 聊天即可完成任务配置。详情见“数据源”部分。

我的数据存储在哪里?
存放在你的 Mac 本地 ~/.junior 目录下。Junior 不保存任何 GitHub、Slack 或 Linear 的鉴权秘钥,而是直接使用你现有的登录凭证。当然,你发送给 Claude、Codex 或连接器的内容仍会传输给相应服务商,这一点我们不会掩饰。更多详情见“隐私”。

需要付费吗?
完全免费且在 MIT 协议下开源。Junior 依托于你自有的 Claude 或 Codex 订阅套餐运行,每个会话都会清晰展示以美元计量的成本消耗。

它现在能合并 PR 吗?
目前不行,现阶段由你来合并。未来对于你已充分信任的工作类型,且仅在你明确允许时,它才可以执行合并。

当它卡住时会发生什么?
它会停下来向你请示,并附上建议解决方案。它的表情会切换为“卡住了(Stuck)”,方便你在早会(Standup)前就能注意到。

为什么要从终端命令行安装?
由于应用尚未经过 Apple 官方公证,直接通过浏览器下载会被系统阻止。脚本可以正确完成安装。请先阅读 install.sh 脚本,换做是我们也会这么做。


让 Junior 来承担分流工作。 单行命令即可安装。完全免费且开源,直接跑在你已付费的 Claude Code 或 Codex 套餐之上。无需注册账号,无需信用卡。

bash curl -fsSL https://usejunior.sh/install.sh | sh

再次运行相同的命令即可更新。Junior.app 自带 Node 环境,无需通过 npm 安装依赖。启动时它会自动连接到已在运行的 Junior 实例,或重新拉起一个实例。更多内容详见 desktop/README.md。

所需环境 原因
macOS(Apple 芯片或 Intel) Junior 是一款 Mac 应用
Claude Code(已登录) Junior、日常任务及简报均基于你的个人登录态运行,而非 API Key
gh 命令行工具(已登录) GitHub 数据源 · 可选
claude.ai Slack 连接器 Slack 数据源 · 可选
Codex(已登录) Codex 聊天功能 · 可选

安装脚本还会将 junior 和 junior-mcp 安装到 ~/.local/bin。你随时可以安全地运行 junior 命令:

bash junior # 若未运行则启动,并输出访问 URL junior status # version, buil

English / 原文

Junior. Runs on your Mac. Asks before anything goes out. A junior engineer for senior engineers. Junior watches GitHub, Slack, Linear and your other tools. It brings you what needs you. Free, open source, runs on your Mac. Junior's face, a lavender key drawn in dots, stands on a dotted ridge on the right.

Install · How it works · The rules · Features · FAQ · Development · Website

latest release macOS, Apple silicon or Intel runs on Claude Code and Codex last commit

RUNS ON YOUR MAC. ASKS BEFORE ANYTHING GOES OUT.

A junior engineer for senior engineers.

Junior watches GitHub, Slack, Linear and your other tools. It brings you what needs you. It takes the rest, and asks before anything goes out. It runs on your Mac, learns how you work, and needs you a little less each week.

curl -fsSL https://usejunior.sh/install.sh | sh

Installs Junior.app for macOS, Apple silicon or Intel. Read install.sh first. We would.

Junior was called Triage until October 2026. Same app, one name now. Updating from Triage moves your data from ~~/.triage~~ to /.junior on first start.

Work arrives from GitHub, Slack, Linear and Sentry. The inbox ranks it: two rows need you, three go to Junior. Junior fixes CI and drafts a reply, then holds the push and the reply for your OK. Sent without your OK: 0.

Example work. Your Tuesday will have more of it.

Junior brings you what needs you. And takes what doesn't. On your Mac, with your tools, and it asks before anything goes out.

  • Only what needs you. GitHub, Slack, Linear and anything with an MCP server, in one ranked list. Each item says why it's there. People waiting go to the top.
  • Junior takes the rest. Junior fixes, retries and waits on CI. It drafts replies and runs your chores on a schedule. You approve what goes out.
  • Your Mac, your plan. Junior runs on your Mac, on the Claude Code or Codex plan you already pay for. No API keys to paste. No bill from us.

Every row in the inbox belongs to you or to Junior.

You, today What changes Whose it is
"I check five tools to find what needs me." One ranked list, with a reason on each item. You, faster
"My teammates wait while I dig." People waiting go to the top. You, faster
"I open PRs and tickets cold." Ask for a brief and start with the context. You, faster
"I babysit PRs and CI." Junior fixes, retries and waits on CI. You approve what goes out. Junior
"I do the same chores every week." Junior runs them on a schedule. Junior
"I keep writing the same replies and updates." Junior drafts them. They wait for your OK. Junior

Three steps. One of them is reading a shell script.

01 · Install the Mac app. One line in Terminal. The app isn't notarized yet, so read install.sh first. We would.

$ curl -fsSL https://usejunior.sh/install.sh | sh
→ Junior.app installed
→ junior, junior-mcp in ~/.local/bin

02 · Connect your tools. GitHub and Slack out of the box. Anything with an MCP server through a job. Junior uses the logins you already have.

03 · Hand Junior the rest. One line, not an essay. Junior reads it back, plans, then works. You approve what goes out.

You: Bump the deps, same as last week.
Junior: Patch versions only, PRs wait for you. Same as last week.

A hand-off, start to finish

Nothing goes out without you. Junior plans first and asks before anything goes out.

  1. You hand it over in one line. A pointer, not an essay. "Fix the flaky test on #498" is plenty. Junior opens the PR, the logs and the history itself.
  2. Junior reads it back and asks once. Everything it needs, in one message, each question with a suggested answer. Often you just say yes.
  3. Junior plans before it touches code. You review the plan like a PR. Small jobs skip this, because nobody needs a plan for a typo.
  4. Junior works on your Mac. Edits, tests and local commits don't need your OK. They stay on your machine until you say otherwise.
  5. You approve what goes out. Pushes, PRs, comments and messages wait for you, word for word. Junior has never posted in #general on its own. It isn't allowed to.

Three rules it can't switch off. Rename it, change its voice. The rules stay.

  1. It reads back what you ask. Before it starts, it says what it understood, in a line or two. A misunderstanding costs one message, not an afternoon.
  2. It asks everything in one message. No drip of questions. One message, and each question comes with the answer it suggests. Often you just say yes.
  3. Nothing leaves without your OK. Pushes, PRs, comments, ticket moves and messages wait for you, word for word. Edits, tests and local commits don't.

You: Bump the deps on api.
Junior: Reading it back: patch and minor bumps in acme/api, one PR, tests green first.

The rest of the job. What happens between the inbox and the push.

|
---|---
Inbox | GitHub, Slack, Linear and anything with an MCP server, in one ranked list. Each item says why it's there. People waiting go to the top. The ranking is plain rules, not a model's mood.
Today | Your morning, already sorted. Junior's morning brief and a shared plan for the day: what's yours, what's Junior's, what's overdue.
Goals | Hand over the outcome, not the steps. Give Junior a done-when. It waits on CI and reviewers, fixes and retries, and stops at your budget.
Jobs | Chores that do themselves. Standing assignments on a schedule, set up by chatting with Junior. Each one gets a trial run before you turn it on.
Review nits | Your PR, minus the nits. It reads the comments on your PR, makes the changes and shows you the diff before it pushes.
Replies | Same answers, fewer keystrokes. Junior drafts them. They wait for your OK.
Briefs | Never open a PR cold. Ask for a brief and start with the context. It reads the diff, the thread and the history, and says where to look first.
Log | Every send waits on a card for your OK, word for word. The log shows what went out and who allowed it.
Sessions | Full Claude Code chats, Codex chats too, and real terminals in the same workspace. Junior checks its UI work in a browser pane you can watch.
Receipts | Every automated run is a session you can open. "Found nothing" means it looked and found nothing.
Workspaces | Work and personal stay apart: separate inbox, jobs, connectors and Claude login.

Its face says what it's doing. Eight moods, each one a state. If it looks worried, something needs you.

Mood What it means
Hello Nothing needs you right now.
Listening You're typing. It's reading.
Thinking Reading the PR, the logs and the thread.
Working On it. Nothing has left your Mac.
Needs you One question, with its suggested answer.
Done Finished. Anything outbound is waiting for your OK.
Stuck Something broke. It says what, instead of guessing.
Asleep Your Mac is asleep. So is Junior.

Over time, Junior takes work end to end. Junior starts with the legwork. As it learns how you work, it takes on more of each job, until it can go from the issue to a merged PR.

Step Day 1 (today) After a few weeks · planned Later · planned
Find the issue Junior Junior Junior
Write the fix Junior, you review the diff Junior, you skim the diff Junior
Open the PR Junior drafts it, you approve Junior, within your rules Junior
Get it green Junior fixes CI, you approve replies Junior Junior
Merge You You Junior, for work you've trusted it with

Only Day 1 is built. The other two columns are the plan, and they say so.

Junior moves up a step only when you say so. It asks with its track record:

You approved my last 12 dependency PRs unchanged. Want me to merge these myself?

Senior and staff engineers, and tech leads who still write code. They use Claude Code or Codex every day, work on a Mac, and have teammates waiting on them.

Not for (yet): teams that want a shared fleet of cloud agents, people who want AI to act without review, and anyone not on a Mac.

Better you read that here than after the install.

The site has the short answers. These are the long ones.

Will Junior post as me?
Not without your OK. PRs, comments, ticket moves and messages wait on a card, word for word. Edits, tests and local commits don't need it, because they stay on your Mac. Two things go without a card, because nobody else sees them yet: a push to your own branch, and a draft PR. A push to the default branch waits like any send. So does a plain force push. Commands that destroy work still ask.

You can also approve a send in advance: one person, one kind of send. "Junior may DM Priya when a PR is ready." Junior proposes these on a card. You add and revoke them in Settings → Approvals.

Will Junior replace me?
It asks before it pushes a branch. You're fine.

Is Junior its own AI model?
No. Junior is Claude Code, or Codex for chats, running with your login. The name, the face and the rules are ours.

Does it work while my Mac sleeps?
No. Junior runs on your Mac and stops when it sleeps, like the rest of us. Junior starts again after a reboot. Scheduled jobs that couldn't run are recorded as missed, not quietly dropped. Quitting the window doesn't stop it either. A LaunchAgent keeps the server up.

What do I need?
A Mac, Apple silicon or Intel. Claude Code, installed and logged in. Codex works too, for chats. The full list is under Install.

Which tools can it watch?
GitHub and Slack out of the box. Linear, Sentry, Notion or anything with an MCP server comes in through a job. You set up a job by chatting with Junior. Details under What feeds it.

Where does my data live?
On your Mac, under ~/.junior. Junior holds no GitHub, Slack or Linear credentials; it uses the logins you already have. What you send to Claude, Codex or a connector still goes to that service. We won't pretend otherwise. More under Privacy.

What does it cost?
Nothing. Junior is free and open source, under the MIT licence. Junior runs on your own Claude or Codex plan, and each session shows what it cost, in dollars.

Can it merge PRs?
Not today. You merge. Later, for work you've trusted it with, and only when you say so.

What happens when it gets stuck?
It stops and asks, with the answer it suggests. Its face says Stuck, so you'll notice before standup.

Why install from Terminal?
The app isn't notarized by Apple yet, so a browser download would get blocked. The script installs it properly. Read install.sh first. We would.

Let Junior do the triage. One line installs it. Free and open source, on the Claude Code or Codex plan you already pay for. No account, no card.

curl -fsSL https://usejunior.sh/install.sh | sh

Run the same line again to update. Junior.app brings its own Node, so there's nothing to install from npm. On launch it attaches to the Junior already running, or starts one. More in desktop/README.md.

You need Why
macOS, Apple silicon or Intel Junior is a Mac app
Claude Code, logged in Junior, jobs and briefs run on your login, not an API key
gh, logged in the GitHub source · optional
claude.ai Slack connector the Slack source · optional
Codex, logged in Codex chats · optional

The installer also puts junior and junior-mcp in ~/.local/bin. The junior command is safe to run any time.

junior             # start if not running, print the URL
junior status      # version, build, port, live sessions
junior restart     # how an update takes effect
junior stop        # stop it (ends live sessions)
junior logs        # tail the server log
junior doctor      # check node, claude, gh, the agent and the server
junior add "Look at the flaky deploy check"   # file a to-do from any terminal

⌘ ⇧ T does the same from anywhere on your Mac.

Early software. Expect rough edges and the odd breaking change.

Source How What arrives
GitHub built in, through your gh login review requests, your PRs by state, mentions
Slack built in, through your claude.ai connector, read-only unread DMs and mentions
Linear, Sentry, PagerDuty, Notion… a job, through any MCP server Claude Code can see whatever the job is told to look for
The web a job, with Claude Code's own search and fetch pages a job finds
You the composer, ⌘``⇧``T, junior add, or MCP anything

Every item has a canonical id. The same PR asked about in Slack and requested on GitHub is one row, not two.

A job is what you would tell a colleague: where to look, what counts, how often. You don't fill in a form. You tell Junior. It reads the job back, asks once, and drafts it switched off. A trial run shows what it would file. Then you turn it on. Each job gets only the tools you grant it.

Junior's tools work from any Claude Code, Codex or Cursor session.

claude mcp add junior -- junior-mcp                 # stdio
# or point a client at http://localhost:5178/mcp    # streamable HTTP

Settings → MCP shows the URL for the workspace you're in, and the one command each client needs. The tools cover the inbox, today's plan, artifacts and job drafts. Upserts are idempotent and never overwrite your own state, so a scanner can't create duplicates or undo a "done".

Everything runs on your Mac. Data lives in SQLite under ~/.junior, one database per workspace. The server answers only this machine, unless you pair a phone in Settings → Phone. Sources go through your gh login and your claude.ai connectors. Junior, jobs and briefs spend your Claude or Codex plan, and the app shows what each one cost.

git clone https://github.com/usejunior-sh/junior && cd junior
npm install
npm run dev          # server on :5188, Vite on :5189. Open the Vite URL.

Dev keeps its data in ~/.junior-dev, so your migrations never touch your real inbox.

The server is not run under a file watcher on purpose: restarting it kills live Claude subprocesses. Restart it by hand after changing server/. npm run typecheck covers both halves, npm test runs the unit tests, and npm run smoke is the end-to-end check against a running server.

Path What lives there
shared/protocol.ts the WebSocket contract, imported by both sides
core/ the store, scoring, jobs, teams and goals, sources
server/ HTTP and WebSocket server, the junior and junior-mcp bins
web/ Vite + React UI
desktop/ Junior.app, the Electron window over the server

Only the work that needs you should reach you.

usejunior.sh · Changelog · Issues · MIT licence

Junior drafted this README. Samar approved it.