Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
0fa0487
Chore(app): Open next development version 0.3.9
ghnmqdtg Jun 6, 2026
5f3ddd7
Fix(app): Keep recording control bar at 50px on record start
ghnmqdtg Jun 6, 2026
33093bb
Merge pull request #23 from Intevia-AI/fix/recording-bar-height
ghnmqdtg Jun 6, 2026
20f1082
Chore: Stop tracking regenerated graphify-out artifacts
ghnmqdtg Jun 6, 2026
7ff8846
Docs: Add design spec for flattening monorepo to single-package repo
ghnmqdtg Jun 7, 2026
bf97b8e
Docs: Add implementation plan for monorepo flatten
ghnmqdtg Jun 7, 2026
131ef61
Chore: Remove orphaned packages/ui (dead after web/admin removal)
ghnmqdtg Jun 7, 2026
152383c
Chore: Move apps/app contents to repo root
ghnmqdtg Jun 7, 2026
ce905d8
Chore: Merge app and root package.json into single root manifest
ghnmqdtg Jun 7, 2026
c06df8f
Chore: Remove pnpm workspace + turbo scaffold and merge .gitignore
ghnmqdtg Jun 7, 2026
9bb7f9e
Chore: Consolidate tests and update CI paths for flat layout
ghnmqdtg Jun 7, 2026
b9d0022
Chore: Regenerate lockfile for single-package layout
ghnmqdtg Jun 7, 2026
516afcf
Docs: Update structure and commands for single-package layout
ghnmqdtg Jun 7, 2026
d6f82bc
Chore: Remove dead Cloud Run proxy deploy script and orphaned .docker…
ghnmqdtg Jun 7, 2026
a3d749c
Chore: Remove dead deno.lock (leftover from removed Supabase edge fun…
ghnmqdtg Jun 7, 2026
e55f547
Chore: Remove orphaned types/renderer.d.ts (broken imports, in no tsc…
ghnmqdtg Jun 7, 2026
6b9cc81
Chore: Deduplicate Logo.tsx (remove case-colliding lowercase logo.tsx)
ghnmqdtg Jun 7, 2026
b9a622d
Chore: Remove stale architecture docs and fix doc links
ghnmqdtg Jun 7, 2026
0258b0e
Merge pull request #24 from Intevia-AI/chore/flatten-monorepo
ghnmqdtg Jun 7, 2026
31eece8
Docs: Adopt feature → stg → main branch flow (remove dev tier)
ghnmqdtg Jun 7, 2026
6afbdae
Merge pull request #25 from Intevia-AI/docs/branch-workflow
ghnmqdtg Jun 7, 2026
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
13 changes: 0 additions & 13 deletions .dockerignore

This file was deleted.

File renamed without changes.
File renamed without changes.
17 changes: 0 additions & 17 deletions .eslintrc.js

This file was deleted.

6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ jobs:
- name: Verify tag matches app version
run: |
TAG="${GITHUB_REF_NAME#v}"
PKG=$(node -p "require('./apps/app/package.json').version")
test "$TAG" = "$PKG" || { echo "::error::Tag v$TAG does not match apps/app/package.json version $PKG"; exit 1; }
PKG=$(node -p "require('./package.json').version")
test "$TAG" = "$PKG" || { echo "::error::Tag v$TAG does not match package.json version $PKG"; exit 1; }

- name: Install pnpm
uses: pnpm/action-setup@v2
Expand Down Expand Up @@ -64,4 +64,4 @@ jobs:
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} # Your Apple Developer Team ID
CSC_LINK: ${{ secrets.CSC_LINK }} # Base64 encoded .p12 certificate
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} # Password for the certificate
run: pnpm --filter Knovy run build:ci
run: pnpm run build:ci
7 changes: 3 additions & 4 deletions .github/workflows/staging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ jobs:
run: pnpm test:run

- name: Apply staging version suffix
working-directory: apps/app
run: |
BASE=$(node -p "require('./package.json').version")
npm version "${BASE}-stg.${{ github.run_number }}" --no-git-tag-version --allow-same-version
Expand All @@ -59,14 +58,14 @@ jobs:
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
run: pnpm --filter Knovy run build:staging
run: pnpm run build:staging

- name: Upload staging build artifacts
uses: actions/upload-artifact@v4
with:
name: knovy-staging-${{ github.run_number }}
path: |
apps/app/dist/*.dmg
apps/app/dist/*.zip
dist/*.dmg
dist/*.zip
retention-days: 14
if-no-files-found: error
31 changes: 12 additions & 19 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,19 @@ node_modules
# Testing
coverage

# Turbo
.turbo

# Vercel
.vercel

# Build Outputs
.next/
out/
build
dist
.eslintcache

# Build caches
.turbo
.next/
.vercel

# Debug
*.log*
npm-debug.log*

# Misc
Expand All @@ -41,22 +40,16 @@ npm-debug.log*
.prompts_app.md
.prompts_web.md
.prompts_admin.md

**/private_keys/

# Misc
.vscode/
.claude/

# We copy the built history viewer to the app public folder
# but we don't need to commit it
apps/app/public/history
apps/app_old/public/history
# Code signing
certificate.p12
build-mac-signed.sh

# Supabase local development files
supabase/.branches/
supabase/.temp/
# Built history viewer copied into the app public folder (not committed)
src/renderer/public/history

# Local transcription models (downloaded at runtime)
apps/app/resources/whisper.cpp/models/
apps/app_old/resources/whisper.cpp/models/
resources/whisper.cpp/models/
File renamed without changes.
File renamed without changes.
7 changes: 3 additions & 4 deletions .prettierrc.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
semi: true
singleQuote: false
trailingComma: 'all'
tabWidth: 2
singleQuote: true
semi: false
printWidth: 100
trailingComma: none
80 changes: 32 additions & 48 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,35 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co

## Development Commands

### Monorepo Management
This repository is a **single-package** Electron desktop app (Knovy) at the repo root,
using **pnpm** as the package manager.

- `pnpm install` - Install all dependencies
- `pnpm dev` - Start all development servers using Turbo
- `pnpm build` - Build all applications using Turbo
- `pnpm lint` - Run linting across all packages using Turbo
- `pnpm install` - Install dependencies
- `pnpm dev` - Start the desktop app in development (`electron-vite dev`)
- `pnpm build:local` - Build the desktop app locally (unsigned)
- `pnpm build` - Build the signed macOS app (requires code signing setup)
- `pnpm format` - Format code with Prettier

### Application-Specific Commands

#### Desktop App (`apps/app`)

- `pnpm --filter app dev` - Start desktop app development (includes history-viewer)
- `pnpm --filter app build:local` - Build desktop app locally (unsigned)
- `pnpm --filter app build` - Build signed macOS app (requires code signing setup)

#### History Viewer (`apps/history-viewer`)

- `pnpm --filter history-viewer dev:history` - Start on port 4001
- `pnpm --filter history-viewer build` - Build static Next.js output
- `pnpm test:run` - Run the config/release tests with Vitest

## Architecture Overview

### Project Structure

This is a **monorepo** managed with **pnpm workspaces** and **Turborepo**.
A single-package Electron + Vite desktop application rooted at the repository root.

```
/
├── apps/
│ ├── app/ # Electron + Vite desktop application (main app)
│ └── history-viewer/ # Next.js app embedded in desktop app
├── packages/
│ ├── ui/ # Shared React components (Radix + Tailwind)
│ ├── eslint-config/ # Shared ESLint configurations
│ └── typescript-config/ # Shared TypeScript configurations
└── docs/ # Architecture documentation
├── src/ # Electron app source (main / renderer / preload)
│ ├── main/ # Main process (window mgmt, IPC, SQLite)
│ ├── renderer/ # React UI (renderer process)
│ └── preload/ # Secure IPC bridge
├── resources/ # Bundled binaries (whisper.cpp, models)
├── code-signing/ # macOS signing / notarization scripts
├── tests/ # Vitest tests
├── docs/ # Architecture documentation
├── electron.vite.config.ts # electron-vite build config
├── electron-builder.yml # Packaging / publish config
└── package.json # Single root manifest
```

### Technology Stack
Expand All @@ -52,11 +44,6 @@ This is a **monorepo** managed with **pnpm workspaces** and **Turborepo**.
- **SQLite** for local data storage
- **Electron-vite** for build system

**History Viewer:**

- **Next.js 15** + **React 19** + **TypeScript**
- Built as a static export and embedded inside the desktop app

**Backend: None**

- There is NO cloud backend. The app is fully local.
Expand All @@ -78,48 +65,45 @@ The desktop app implements a **dual-stream audio architecture**:

**Key Files:**

- `apps/app/src/renderer/public/worklets/mic-audio-processor.js`
- `apps/app/src/renderer/public/worklets/system-audio-processor.js`
- `apps/app/src/renderer/src/hooks/useAudioAnalysis.ts`
- `apps/app/src/renderer/src/components/RealTimeAnalysis.tsx`
- `src/renderer/public/worklets/mic-audio-processor.js`
- `src/renderer/public/worklets/system-audio-processor.js`
- `src/renderer/src/hooks/useAudioAnalysis.ts`
- `src/renderer/src/components/RealTimeAnalysis.tsx`

#### Electron Architecture

- **Main Process**: `apps/app/src/main/index.ts` - Window management, IPC, database
- **Renderer Process**: `apps/app/src/renderer/src/` - React UI components
- **Preload Scripts**: `apps/app/src/preload/index.ts` - Secure IPC bridge
- **Database**: SQLite with `apps/app/src/main/database-service.ts`
- **Main Process**: `src/main/index.ts` - Window management, IPC, database
- **Renderer Process**: `src/renderer/src/` - React UI components
- **Preload Scripts**: `src/preload/index.ts` - Secure IPC bridge
- **Database**: SQLite with `src/main/database-service.ts`

### Environment Setup

The desktop app requires no cloud credentials. If needed, copy `apps/app/.env.example` to `apps/app/.env` — the app runs without any API keys (Ollama is local HTTP, whisper.cpp is bundled).
The desktop app requires no cloud credentials. If needed, copy `.env.example` to `.env` — the app runs without any API keys (Ollama is local HTTP, whisper.cpp is bundled).

### Development Workflow

1. **Setup**: Install dependencies with `pnpm install`
2. **Ollama** (optional): Install and start Ollama for AI enhancement (`http://localhost:11434`)
3. **Development**: Use `pnpm dev` or `pnpm --filter app dev` for the desktop app
4. **Quality**: Run `pnpm lint` and `pnpm format` before commits
3. **Development**: Use `pnpm dev` for the desktop app
4. **Quality**: Run `pnpm format` before commits

### Testing

- **Desktop App**: No formal test setup currently
- **Config/release tests**: `pnpm test:run` (Vitest) — validates `electron-builder.yml` and the GitHub Actions release/staging workflows.

### Release Process

Desktop app releases are automated via **GitHub Actions**:

1. **Update version** in `apps/app/package.json`
1. **Update version** in `package.json`
2. **Create git tag** matching `v*.*.*` pattern
3. **Push tag** to trigger automated build, signing, and release
4. **Code signing** requires Apple Developer credentials in repository secrets

### Important Notes

- **Message Threading**: Recent feature enabling speaker identification in transcription UI
- **History Viewer**: Embedded Next.js app showing session history, built separately and copied into desktop app
- **Shared Packages**: UI components and configs are shared across applications via workspace dependencies
- **Local Development**: Desktop app runs history-viewer concurrently during development
- **Database Schema**: Includes `source_type` field for distinguishing microphone vs system audio transcriptions

## Working with Agents
Expand Down
Loading
Loading