Kody weekly: Apps run as their publisher, and more for teams
Kent C. Dodds · · 11 min read
Here is what shipped in Kody from October 24 to October 30, 2026. This week package apps run as the person who published them, team orgs get public pages and org-wide grants, and credentials and sign-in got safer and simpler. Five changes need action: see Breaking changes below.
Package apps run as their publisher
What shipped
A hosted package app now runs as its publisher. The publisher pays for the app, and the publisher's credentials fill the app's needs. Visitors bring only a verified identity, and Sign in with Kody lets an app use a visitor's own data with one consent scope per need, including optional scopes, "ask later," and per-scope revoke. Each app gets its own cookies, its own rate limits, and a per-visitor spend view, and app owners get a Connected people tab that shows who connected to the app and lets them sign one person out.
Why it matters
You can share an app with people outside your org without asking each of them to connect the same accounts first. You stay in control of what it costs, and visitors choose what of their own data the app can use.
Example
Publish a package app that calls an integration you have connected, open it in a private window as a visitor, then check the per-visitor spend and the Connected people tab on the package page.
Docs: Package apps · PRs: #4278, #4351, #4329, #4237, #4473, #4455
Public pages for team orgs
What shipped
A public team org now has a real page at its handle, kody.codes/@your-org,
that anyone can open, signed in or not. It shows the org's avatar, name, bio,
and public packages. You choose Public or Private when you create the org and
can change it later in Settings. Members still get their workspace one click
away.
Why it matters
A team can point people at one URL for everything it publishes, the same way you would link a GitHub organization.
Example
- Open your team org's Settings and set its profile to Public.
- Sign out and visit
https://kody.codes/@your-org. - Check that only your public packages are listed.
Docs: Organizations · PR: #4525
Grant access to everyone in your org at once
What shipped
Org Owners can now grant a resource to everyone in the organization. The grant
covers current members and anyone who joins later, and someone who leaves loses
access on the next check. Owners can also grant read permissions org-wide, such
as job:read, package:read, and app:read, so a Member can see run history
or packages across the org without becoming an Owner. Write actions are never
included in org-wide read grants.
Why it matters
You no longer hand out the same grant to every teammate, one by one, and again for each new hire. Members can see what they need without getting more power than they need.
Example
- On a private package's Collaborators tab, add Everyone in this organization with the Use preset.
- On the org's Grants page, pick a Member and check Jobs and run history.
- Click Save read access. That Member can now list runs across the org.
Docs: Organizations · PRs: #4502, #4491
Custom domains for package apps on every paid org
What shipped
Every paid org can now point a custom hostname at a package app, and paid
personal orgs can manage custom domains from their Settings page. The package
page shows each domain's DNS status and re-checks pending hostnames, notices for
add, sync, and remove appear right beside the form, and Open app opens a
fully active custom domain instead of the kody.run subdomain. Free orgs stay
blocked.
Why it matters
Your app can live on your own domain, and you can see whether DNS is set up without leaving the package page.
Example
- Open your package app's settings and add
app.example.com. - Create the DNS records Kody shows you.
- Watch the status turn active, then use Open app.
Docs: Custom domains · PRs: #4470, #4594, #4210, #4359, #4392
Shareable org invite links
What shipped
You can create reusable invite links from the Members page, give each one a label and default teams, and see when each link was last used. Agents can create, list, revoke, and accept invite links through MCP, the API, and the CLI.
Why it matters
Inviting a whole team is one link instead of one invite per person, and you can ask your agent "how do I invite my whole team" and get a working answer.
Example
- On your org's Members page, create an invite link labeled
Engineering. - Pick the teams new members should join.
- Share the link, and revoke it when you are done.
Docs: Organizations · PR: #4385
Sign the CLI in from any machine
What shipped
kody login --device signs the CLI in from machines whose browser cannot reach
the CLI's local callback, such as remote VMs and SSH sessions. You open a URL on
any device, enter a short code, and approve. kody install also detects SSH and
machines with no display, and prints the OAuth steps for Codex and OpenCode
instead of starting a browser login that cannot finish.
Why it matters
Setting up Kody on a remote box no longer needs port forwarding or a desktop.
Example
ssh my-server
kody login --deviceDocs: Local execute · PRs: #4434, #4442, #4490
Credentials fill only where their owner allows
What shipped
The gateway now enforces each credential's fill placement. A credential fills a query string, URL path, or request body only when its owner opted in, and vault credentials get the same placement controls. Changing a credential's placement or how it is injected is website-only, so code running with the credential cannot move its value. Agents can build a one-click approval link that asks the owner to allow a placement, and refusal links open the exact credential that was refused.
Why it matters
Query strings end up in logs and bodies end up in stored records. Now a value reaches only the parts of a request its owner approved, and code cannot change that.
Example
- Run a package whose request puts a credential in the body.
- Open the link in the refusal message.
- Approve body placement for that credential, then run it again.
Docs: Credentials · PRs: #4430, #4514, #4428, #4492
Login credentials that keep tokens out of your code
What shipped
Kody now keeps login credential sessions encrypted at rest and shares one token
exchange across runs, so concurrent runs do not spend the same refresh token
twice. A 401 triggers a single retry with a fresh session, and rotated refresh
tokens are saved automatically. Sealed refresh tokens from an exchange in a run
can be saved as a login credential, and your code never holds either token.
Why it matters
Integrations that sign in with a refresh token keep working across runs without your package ever storing or seeing the token.
Example
In a package run, exchange a provider login for a sealed refresh token, save it
as a login credential, and let later runs use that credential by name.
Docs: Credentials · PRs: #4566, #4567, #4568
Sign up from the OAuth screen and choose the org you connect
What shipped
Someone without an account who lands on Kody's OAuth consent screen can now
create one right there and continue the same authorization. kody login waits
15 minutes to leave time for email verification. When you connect an integration
with OAuth, the /connect/oauth page shows and lets you pick which org it
writes to, and members can connect their own account through an org's OAuth app.
Why it matters
New people can go from "connect your agent to Kody" to a working connection without starting over, and integrations land in the org you meant.
Example
- Add Kody to your agent and start its sign-in.
- On the consent screen, choose to sign up.
- Verify your email and approve. The agent finishes connecting.
Docs: OAuth · PRs: #4597, #4526, #4528, #4527
Skills dashboard with version history
What shipped
A new Skills dashboard lists your published skills with read analytics: 30-day activity, most-read skills, and recent reads. Each skill has a History view where you can pick a published version, compare it line by line with another, and restore an earlier version as a new publish.
Why it matters
You can see which skills your agents actually read, and undo a bad skill edit without touching the rest of the package.
Example
Open the Skills dashboard, pick a skill, open History, compare the two latest versions, and restore the older one.
Docs: Package skills · PRs: #4460, #4519
Spam and archive for every inbox
What shipped
You can mark messages as spam or archive them in any Kody inbox, and both are fully reversible: nothing is deleted. Default views hide spam and archived mail. After marking spam you can choose to block the sender, and Kody never blocks anyone automatically.
Why it matters
Agent inboxes stay readable without risking a message you need.
Example
Open an inbox, mark a message as spam, choose whether to block the sender, then switch the view to Spam to restore it.
Docs: Agent inbox · PR: #4323
See who started each run
What shipped
Every run now records the user, client, and label that started it, and Activity shows it.
Why it matters
Team owners can tell which member or which agent triggered an execute error or
a scheduled call.
Example
Open Activity in a team org and check the started-by column on a failed run.
PR: #4309
Packages declare their capabilities
What shipped
A kody.capabilities field in package.json lets a package declare what it
needs. A warn-only publish check follows the full import closure and flags
capabilities that are used but not declared, naming both the app and the
imported package. A migration codemod with a dry-run report helps authors add
the declarations.
Why it matters
You can see what a package can do from its manifest, and catch an undeclared capability before it matters, without any publish being blocked this week.
Example
{
"name": "@you/my-helper",
"kody": {
"capabilities": ["secretList", "secretSet"]
}
}Docs: Package authoring · PRs: #4550, #4554, #4539, #4545, #4547
Secret provider placeholders in published packages
What shipped
A published package can now declare a secret-provider credential slot that
names another package as its vault provider, then reference vault items in its
code. Publish checks and runtime enforcement both honor the declaration.
Why it matters
If you keep secrets in a vault such as 1Password, a published package can use them without copying values into Kody.
Example
Add a secret-provider slot to kody.credentials that names your vault
provider package, reference the vault item in a request, and publish.
Docs: Secret providers · PR: #4426
More updates
- Community: Adds a Forks page for every package that shows the forks you can open, and lets you choose an org for one-click installs. (#4401, #4423)
- Packages: Adds a New repository button to the Repositories page, with a copyable prompt for your agent. (#4409)
- Credentials: Opens the new credential page with a "Let your agent set it up" prompt, and adds a searchable package picker for org credentials. (#4431)
- Orgs: Emails your previous address when your account email changes. (#4388)
- Email: Replies from the plus alias a message was sent to, and accepts an
optional
fromonemailSendandemailReply. (#4517) - Execute: Says where every run happened with a
ranOnfield and a text line such as "Ran on Kody cloud." (#4572) - Automations: Shows why a job is off, and records manual job runs in the org audit log. (#4248, #4381)
- Plus smaller changes, including
.kodyignoresupport for publish (#4548), unhandled follow events kept as Recent updates (#4325), and faster Markdown and code highlighting (#4516). See the full release list.
Fixes
- Apps: Tightens package app cookie handling. (#4419)
- Automations: Fixes scheduled jobs silently skipping a due run. (#4378)
- Execute: Fixes overlapping
executecalls mixing their console output, and packages that cache an authenticated fetch crashing on repeat runs. (#4417, #4512) - Orgs: Fixes permission denials showing a blank error page instead of a 403 with a link to Grants. (#4510)
- Packages: Fixes publish retrying for a long time on memory-limit errors instead of failing fast with guidance. (#4374)
- Packages: Fixes app asset folders holding only images being reported as empty. (#4495)
- Orgs: Fixes signing up again with the email of a deleted account. (#4458)
Breaking changes
- Apps: Package apps no longer run as their visitor. Action: check that your own credentials cover your app's needs, and use Sign in with Kody where the app needs a visitor's data. (#4278)
- Credentials: A credential fills a query string, URL path, or body only when its owner allows that placement. Action: if a request is refused, open the link in the error and approve the placement. (docs, #4430)
- Execute: The
invokeshortcut is removed andexecuterequirescode. Action: pass a shortcodemodule that imports and calls the export. (docs, #4481) - Automations:
oncejob schedules are removed. Action: schedule delayed one-time work withworkflows.createandrunAtinstead. (#4310) - Packages: Package retrievers are removed, and search no longer runs
package code. Action: delete
kody.retrieversfrom yourpackage.json. (#4313)
Try it
- On a remote machine, run
kody login --deviceand enter the code it prints in your browser. - Make your team org Public and share its page, as described in the organizations guide.
- Point a domain at a package app with the custom domains guide.
Questions or feedback? Join us on the Kody Discord.