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
Binary file added .github/assets/desktop.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
133 changes: 133 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
name: Release

on:
push:
tags:
- "v*"

permissions:
contents: write

jobs:
checks:
name: Checks
runs-on: ubuntu-24.04

steps:
- name: Checkout
uses: actions/checkout@v7

- name: Install uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true

- name: Set up Python
run: uv python install 3.12

- name: API dependencies
working-directory: api
run: uv sync --locked

- name: API lint
working-directory: api
run: uv run ruff check .

- name: Set up pnpm
uses: pnpm/action-setup@v6
with:
version: 11.10.0

- name: Set up Node
uses: actions/setup-node@v7
with:
node-version: 24

- name: Desktop dependencies
working-directory: desktop
run: pnpm install --frozen-lockfile

- name: Desktop typecheck
working-directory: desktop
run: pnpm typecheck

- name: Desktop lint
working-directory: desktop
run: pnpm lint

- name: Extension dependencies
working-directory: extension
run: pnpm install --frozen-lockfile

- name: Extension typecheck
working-directory: extension
run: pnpm typecheck

- name: Extension lint
working-directory: extension
run: pnpm lint

release:
name: Build And Release
runs-on: ubuntu-24.04
needs: checks

steps:
- name: Checkout
uses: actions/checkout@v7

- name: Install Linux packaging dependencies
run: |
sudo apt-get update
sudo apt-get install -y libarchive-tools rpm

- name: Install uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true

- name: Set up Python
run: uv python install 3.12

- name: API dependencies
working-directory: api
run: uv sync --locked

- name: Package API runtime
working-directory: api
run: uv run package-runtime

- name: Set up pnpm
uses: pnpm/action-setup@v6
with:
version: 11.10.0

- name: Set up Node
uses: actions/setup-node@v7
with:
node-version: 22

- name: Desktop dependencies
working-directory: desktop
run: pnpm install --frozen-lockfile

- name: Build desktop
working-directory: desktop
run: pnpm build

- name: Extension dependencies
working-directory: extension
run: pnpm install --frozen-lockfile

- name: Build extension
working-directory: extension
run: pnpm zip

- name: Create GitHub release
uses: softprops/action-gh-release@v2
with:
prerelease: true
generate_release_notes: true
files: |
desktop/release/**/*
extension/.output/*.zip
21 changes: 5 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@ Draftlet captures conversations, generates drafts through local LLM providers
(Ollama first), keeps durable local memory, and lets you review everything in a
focused desktop writing surface without sending your data to a cloud service.

<p align="center">
<img src=".github/assets/desktop.webp" alt="Draftlet desktop app" width="800" />
</p>

## Status

Draftlet is in active alpha development as `v1.0.0-alpha1`. It is not published
Draftlet is in active alpha development as `v1.0.0-alpha1.1`. It is not published
as a release yet.

Current working scope:
Expand All @@ -28,14 +32,6 @@ Current working scope:
- **Runtime** - local FastAPI service with SQLite persistence, capture ingest,
connector management, search, and local generation through Ollama.

Still in progress:

- Gmail OAuth/API sync.
- Gmail send and compose insertion.
- Packaged runtime installation.
- Production hardening and installer polish.
- Windows/macOS support.

## Repository Layout

```text
Expand All @@ -62,13 +58,6 @@ Folder READMEs contain build and run instructions for each surface:
- Provider connector: Ollama.
- Local persistence in SQLite.

## Out Of Scope For Now

- Cloud sync, accounts, billing, or team features.
- Auto-capture across arbitrary apps.
- WhatsApp native desktop capture.
- Gmail OAuth/API sync or external email sending.

## License

AGPLv3. See [`LICENSE`](./LICENSE).
1 change: 1 addition & 0 deletions api/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ __pycache__/
build/
develop-eggs/
dist/
dist-runtime/
downloads/
eggs/
.eggs/
Expand Down
8 changes: 8 additions & 0 deletions api/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ uv run ruff check .
uv build
```

## Package Runtime

```bash
uv run package-runtime
```

The packaged runtime is written to `dist-runtime/` for the Electron build.

## Telegram Environment

Telegram uses MTProto user-client auth. Configure these before connecting
Expand Down
5 changes: 4 additions & 1 deletion api/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "draftlet-api"
version = "1.0.0-alpha1"
version = "1.0.0a1.post1"
requires-python = ">=3.12"
license = "AGPL-3.0-only"
dependencies = [
Expand All @@ -16,6 +16,8 @@ dependencies = [

[project.scripts]
dev = "draftlet_api:dev"
draftlet-runtime = "draftlet_api.runtime:main"
package-runtime = "draftlet_api.scripts.package_runtime:main"
alembic-generate = "draftlet_api.scripts.alembic:generate"
alembic-upgrade = "draftlet_api.scripts.alembic:upgrade"
alembic-downgrade = "draftlet_api.scripts.alembic:downgrade"
Expand All @@ -27,5 +29,6 @@ build-backend = "uv_build"

[dependency-groups]
dev = [
"pyinstaller>=6.0",
"ruff>=0.15.21",
]
4 changes: 0 additions & 4 deletions api/src/draftlet_api/database/models/conversation.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@
from draftlet_api.database.models.draft import Draft
from draftlet_api.database.models.message import Message

if TYPE_CHECKING:
from draftlet_api.database.models.draft import Draft


def utcnow() -> datetime:
return datetime.now(UTC)

Expand Down
21 changes: 0 additions & 21 deletions api/src/draftlet_api/database/models/fts.py

This file was deleted.

5 changes: 0 additions & 5 deletions api/src/draftlet_api/dtos/common.py

This file was deleted.

2 changes: 1 addition & 1 deletion api/src/draftlet_api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]:
def create_app() -> FastAPI:
settings = get_settings()
configure_logging(settings.log_level)
app = FastAPI(title="Draftlet Runtime", version="1.0.0-alpha1", lifespan=lifespan)
app = FastAPI(title="Draftlet Runtime", version="1.0.0-alpha1.1", lifespan=lifespan)
app.add_exception_handler(DraftletApiError, problem_details_handler)
if settings.cors_origins:
app.add_middleware(
Expand Down
48 changes: 0 additions & 48 deletions api/src/draftlet_api/repositories/conversation_repository.py

This file was deleted.

42 changes: 0 additions & 42 deletions api/src/draftlet_api/repositories/draft_repository.py

This file was deleted.

2 changes: 1 addition & 1 deletion api/src/draftlet_api/routers/health.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ async def health(db: AsyncSession = Depends(get_db)) -> HealthRead:
telegram_ok = telegram_state == "ready"
return HealthRead(
status="ok" if database.ok else "degraded",
version="1.0.0-alpha1",
version="1.0.0-alpha1.1",
database=database,
ollama=ComponentHealth(
ok=ollama_ok,
Expand Down
Loading