Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 35 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,24 @@ on:
branches: [master, main]

jobs:
release-scope:
name: Release Scope
runs-on: ubuntu-latest
outputs:
release_scope: ${{ steps.scope.outputs.scope }}
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 22
- name: Validate commit-pinned release scope
id: scope
run: node scripts/resolve-release-scope.mjs --github-output

typecheck:
name: Type Check
runs-on: ubuntu-latest
needs: release-scope
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6.0.10
Expand All @@ -26,6 +41,8 @@ jobs:
run: pnpm --filter @deft/app-kit test
- name: Verify release publishing contract
run: pnpm test:release-workflow
- name: Verify container process supervision
run: node --test scripts/docker-entrypoint.test.mjs
- name: Verify deterministic Hermes integration bundle
run: pnpm test:hermes-integration-bundle
- name: Lint web
Expand All @@ -38,6 +55,15 @@ jobs:
src/lib/space-socket.test.ts
src/lib/module-collection-nav.test.ts
src/lib/apps.test.ts
src/lib/api-retry.test.ts
src/lib/api-auth.test.ts
src/lib/editor-attribute-security.test.ts
src/lib/native-create-intent.test.ts
src/lib/time.test.ts
src/lib/calendar-event-form.test.ts
'src/app/(app)/notes/note-save-coordinator.test.ts'
'src/app/(app)/notes/protected-note-image.test.ts'
'src/app/(app)/notes/note-load-state.test.ts'
- name: Type check API
run: pnpm --filter @deft/api typecheck
- name: Type check Web
Expand Down Expand Up @@ -104,7 +130,8 @@ jobs:
hermes-release-gate:
name: Hermes Employee Release Gate
runs-on: ubuntu-latest
needs: typecheck
needs: [release-scope, typecheck]
if: needs.release-scope.outputs.release_scope == 'hermes-certified'
services:
postgres:
image: pgvector/pgvector:pg16
Expand Down Expand Up @@ -183,7 +210,13 @@ jobs:
build:
name: Build
runs-on: ubuntu-latest
needs: [typecheck, test, hermes-release-gate]
needs: [release-scope, typecheck, test, hermes-release-gate]
if: >-
always() && !cancelled() &&
needs.release-scope.result == 'success' &&
needs.typecheck.result == 'success' &&
needs.test.result == 'success' &&
(needs.release-scope.outputs.release_scope == 'core' || needs.hermes-release-gate.result == 'success')
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6.0.10
Expand Down
31 changes: 30 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,29 @@ env:
IMAGE_NAME: maneek21/deft

jobs:
scope:
name: Resolve release scope
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
release_scope: ${{ steps.scope.outputs.scope }}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref }}
- uses: actions/setup-node@v7
with:
node-version: 22
- name: Validate commit-pinned release scope
id: scope
run: node scripts/resolve-release-scope.mjs --github-output

certify:
name: Certify Hermes employee release
runs-on: ubuntu-latest
needs: scope
if: needs.scope.outputs.release_scope == 'hermes-certified'
permissions:
contents: read
services:
Expand Down Expand Up @@ -142,7 +162,11 @@ jobs:
publish:
name: Publish release image
runs-on: ubuntu-latest
needs: certify
needs: [scope, certify]
if: >-
always() && !cancelled() &&
needs.scope.result == 'success' &&
(needs.scope.outputs.release_scope == 'core' || needs.certify.result == 'success')
steps:
- uses: actions/checkout@v7
with:
Expand Down Expand Up @@ -178,12 +202,14 @@ jobs:
echo "sha=$tag_commit" >> "$GITHUB_OUTPUT"

- name: Download Hermes employee certification
if: needs.scope.outputs.release_scope == 'hermes-certified'
uses: actions/download-artifact@v4
with:
name: hermes-employee-release-certification
path: dist

- name: Verify carried Hermes certificate and bundle
if: needs.scope.outputs.release_scope == 'hermes-certified'
env:
RELEASE_TAG: ${{ steps.release.outputs.tag }}
RELEASE_VERSION: ${{ steps.release.outputs.version }}
Expand Down Expand Up @@ -310,6 +336,7 @@ jobs:
run: |
mkdir -p dist
cp docker-compose.yml compose.prod.yml compose.release.yml LICENSE NOTICE THIRD-PARTY-LICENSES.md dist/
cp docs/self-hosting.md dist/self-hosting.md
# GitHub release assets cannot retain a leading dot reliably. Publish
# the template under a stable explicit name so downloaded checksums
# match the asset name on every client.
Expand All @@ -332,6 +359,7 @@ jobs:
output-file: dist/deft-${{ steps.release.outputs.version }}.spdx.json

- name: Archive and reverify the carried Hermes integration
if: needs.scope.outputs.release_scope == 'hermes-certified'
env:
HERMES_BUNDLE_EVIDENCE_PATH: ${{ runner.temp }}/hermes-bundle-evidence.json
shell: bash
Expand Down Expand Up @@ -360,6 +388,7 @@ jobs:

- name: Generate release manifest
env:
RELEASE_SCOPE_PATH: release/release-scope.json
RELEASE_TAG: ${{ steps.release.outputs.tag }}
RELEASE_VERSION: ${{ steps.release.outputs.version }}
RELEASE_COMMIT: ${{ steps.release.outputs.sha }}
Expand Down
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,54 @@ env vars. Patch versions (`0.X.Y`) are non-breaking fixes only.

## [Unreleased]

Planned for the v0.3.0-preview.15 core preview. Publication is pending release checks.

### Added

- Connected Apps can request access to supported workspace resources and run
bounded scheduled actions after operator review. App Kit includes the matching
package and authoring support. These experimental features are disabled by
default; see [product status](docs/product-status.md) before enabling them.

### Fixed

- Retrying a task, project, event or message after a lost response no longer
creates a duplicate of the same request.
- Notes retain pending edits through interrupted saves and refresh expired image
access. Unavailable private notes show a recoverable error instead of an empty
editor.
- Native calendar creation and editing use the profile timezone consistently;
editing targets the existing event. Task date controls support keyboard use.
- Chat attachments appear once in the composer, and search previews show readable
text rather than stored HTML.
- Connections wait for initialization before joining chat rooms, and background
queues wait until storage is ready. Automation lists use fewer database queries.
- Approved task creation records its result. Invalid App uninstall requests
return a useful client error instead of a server failure.
- Backups and upgrades preserve recovery assets; container process supervision
propagates startup failures and shutdown correctly.

### Security

- Browser sessions rotate durable refresh credentials and invalidate outstanding
credentials on password changes. Public OAuth endpoints have bounded requests.
- Tiptap dependencies are updated to 3.30.4, including the fix for
[GHSA-cp6q-959q-f8rh](https://github.com/advisories/GHSA-cp6q-959q-f8rh).

### Release and upgrade notes

- The next preview is a **core** release. Hermes is not certified or
distributed as a supported integration bundle for this candidate. Existing
integration source and historical certification records are not new proof.
- The schema advances to `0.3.0-preview.29`, including durable browser-session
state and scoped native-create identities. Back up first and use the documented
versioned upgrade path; do not run fresh-install initialization on existing data.
- Keep the previous image, database backup, uploads, and encryption secrets
together for recovery. Image rollback alone is not a database rollback.
- Images remain Linux amd64 previews. This release does not claim long-duration
soak coverage or Hermes certification. Read the release's verification results
and [current limitations](docs/current-limitations.md) before deployment.

## [0.3.0-preview.14] — 2026-08-31

### Fixed
Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ Deft welcomes focused bug fixes, tests, documentation, accessibility improvement

### Requirements

- Node.js 20 or newer (22 recommended)
- pnpm 9 or newer
- Node.js 22.13.0 or newer
- pnpm 11.10.0 (pinned in `package.json`)
- PostgreSQL 16 with pgvector

```bash
Expand Down
13 changes: 10 additions & 3 deletions FEATURES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Deft capability reference

> Last verified against the repository on July 16, 2026.
> Availability last reconciled on September 7, 2026. The latest published image is `v0.3.0-preview.14`; features present on `master` may belong to the unpublished `v0.3.0-preview.15` core candidate. See the [availability map](docs/product-status.md).
>
> Deft is an alpha. This file describes the current product surface, not a compatibility guarantee. See [current limitations](docs/current-limitations.md) and the [roadmap](ROADMAP.md) before planning a production deployment.

Expand Down Expand Up @@ -113,7 +113,7 @@ Agent employees are separate workspace identities backed by a customer-controlle
- Operate under trust level, scope, health, action-cap, audit, and approval rules
- Expose supervision state, recent contact, failures, and bridge health to admins

Deft does not require a specific agent framework. A compatible runtime can be built with Hermes, Codex, Claude, or another streamable HTTP MCP client. The external runtime is operated separately from the Deft application stack.
Deft does not require a specific agent framework. A compatible customer-operated runtime can use the streamable HTTP MCP endpoint. Hermes support is release-specific historical compatibility; it is excluded from the upcoming core preview and is not a new compatibility claim.

## Personal AI app connections

Expand Down Expand Up @@ -174,7 +174,14 @@ Provider keys are optional. Core workspace functionality remains available witho
- Production guidance for VPS, domain, HTTPS, and reverse proxy setup
- Synthetic 60-person certification tooling for isolation, bulk operations, job backlog, notification volume, and recovery exercises

Fresh installs currently use `pnpm db:push-full`. A supported versioned upgrade workflow is still deferred; see [current limitations](docs/current-limitations.md).
Fresh installs use `pnpm db:push-full`. Supported release-to-release upgrades use `pnpm db:upgrade` from the `v0.2.0-preview.1` baseline; see [current limitations](docs/current-limitations.md).

## Apps and Modules

- Modules define domain records, relationships, and Deft-rendered native views.
- Declarative internal Apps package Modules for review and installation and are an opt-in alpha capability.
- Connected Apps and bounded daily actions are implemented on `master` for the upcoming core candidate. They are experimental, disabled by default, and require the flags and review flow in the [operator guide](docs/app-run-operations.md).
- The current App protocols do not provide arbitrary custom UI, public portals, general external runtimes, or synchronization.

## Security posture

Expand Down
13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

[Website](https://deft.ing) | [Self-hosting guide](docs/self-hosting.md) | [Contributing](CONTRIBUTING.md)

**Try Deft:** [install a workspace, connect your AI client, or build an internal App](docs/getting-started.md). The latest downloadable image is `v0.3.0-preview.14`; the `v0.3.0-preview.15` core candidate described on `master` has not been published. See the [current availability map](docs/product-status.md) before evaluating an unreleased feature.

![Where humans and agents work together.](docs/assets/repository/hero.png)

Deft is a self-hostable, open-source workspace where people and AI agents share the same chat, tasks, knowledge, calendar context, approvals, and receipts.
Expand All @@ -18,9 +20,9 @@ Instead of pasting fragments from Slack, Notion, and a task tracker into an AI c

1. **Work happens in context.** People discuss an issue in chat, update a task, write a note, or record a decision.
2. **An agent reads the same workspace.** Defty, an agent employee, or a personal MCP client can retrieve the relevant messages, tasks, wiki pages, people, and calendar context.
3. **Writes stay governed.** Risky changes are drafted first and shown as approval cards in the conversation and approval inbox.
3. **Governed actions can require review.** Employee actions follow their approval policy, with proposed changes shown in conversation cards and the approval inbox. Personal MCP writes use the authorizing person's permissions and scopes.
4. **The result lands in Deft.** Tasks, messages, notes, wiki pages, and status changes become part of the shared record.
5. **Every action leaves a receipt.** The workspace records who or what acted, what changed, and where the result lives.
5. **Governed agent actions leave receipts.** Deft records the actor, outcome, and result for actions that pass through its governed execution paths.

![A live Deft workspace](docs/assets/repository/dashboard.png)

Expand All @@ -46,9 +48,9 @@ Instead of pasting fragments from Slack, Notion, and a task tracker into an AI c

Deft still works as a normal workspace without an AI provider key. Chat, tasks, notes, knowledge, calendar, people, and teams remain available; AI features stay disabled until a provider is configured.

### An extensible workspace through Modules
### An extensible workspace through Modules and Apps

Deft's workspace can also grow with the needs of a company. Modules let developers add domain-specific collections and applications while inheriting the workspace primitives that already exist, including identity, permissions, search, context and agent access.
Modules add domain records, relationships, and native views. Apps package supported workspace extensions for operator review and installation. Declarative internal Apps are an opt-in alpha capability; connected Apps and bounded scheduled actions are implemented in the upcoming core candidate and remain disabled by default. Arbitrary custom UI and public portals are planned rather than part of the current contract.

The bundled **Contacts** module is the first example of this model. The goal is not to turn Deft's core into every application a company might need, but to let new capabilities live on the same shared substrate instead of becoming another disconnected system.

Expand Down Expand Up @@ -102,13 +104,14 @@ cd Deft
cp .env.example .env
```

Set the three required secrets in `.env`:
Set the four required secrets in `.env`:

| Variable | Generate with |
|---|---|
| `POSTGRES_PASSWORD` | `openssl rand -hex 32` |
| `JWT_SECRET` | `openssl rand -hex 32` |
| `JWT_REFRESH_SECRET` | `openssl rand -hex 32` |
| `ENCRYPTION_KEY` | `openssl rand -hex 32` |

Then build, start, initialize, and verify the stack:

Expand Down
Loading