Project Structure

Understand the Yap codebase architecture

Overview

Yap is built with Wails, combining a Go backend with a React frontend.

yap/
├── app.go                 # Main application logic
├── main.go                # Wails entry point
├── internal/              # Go packages
├── frontend/              # React application
└── build/                 # Build assets and output

Entry Points

main.go

Wails application entry point. Configures:

  • Window size and properties
  • Menu binding
  • Asset handling

app.go

Core application struct with methods exposed to the frontend:

  • Recording state management
  • Transcription coordination
  • History management
  • Configuration

Internal Packages

internal/audio

Audio recording using PortAudio.

FilePurpose
recorder.goPortAudio recording at 16kHz mono
wav.goWAV file encoding/decoding

Key types:

  • Recorder — Manages audio capture
  • AudioLevel — Real-time level monitoring

internal/hotkey

Global hotkey detection.

FilePurpose
hotkey_darwin.gomacOS implementation (CGO/Cocoa/Carbon)
hotkey_other.goStub for other platforms

Supports:

  • Right/Left Option keys
  • Fn key
  • Double-tap detection

internal/models

Configuration and model management.

FilePurpose
config.goApp settings (JSON persistence)
manager.goModel download from HuggingFace
stats.goUsage statistics tracking

internal/transcribe

Transcription engine implementations.

FilePurpose
engine.goInterface definition, types
whisper_local.gowhisper.cpp CLI integration
openai.goOpenAI API client
type Engine interface {
    Transcribe(audioPath string) (string, error)
}

internal/overlay

Native recording overlay.

FilePurpose
overlay_darwin.gomacOS NSPanel with waveform
overlay_other.goStub for other platforms

internal/system

System integration utilities.

FilePurpose
clipboard.goCross-platform clipboard
clipboard_darwin.gomacOS CGEvent paste simulation
clipboard_other.goOther platforms

internal/tray

System tray / menu bar integration.

FilePurpose
tray.goSystray menu with Start/Stop, Show, Quit

internal/sounds

Audio feedback.

FilePurpose
sounds.goSound playback manager
start.mp3Recording start sound
stop.mp3Recording stop sound

Frontend

React 18 + TypeScript + Vite.

frontend/
├── src/
│   ├── App.tsx            # Main UI component
│   ├── App.css            # Styles
│   ├── RecordingOverlay.tsx  # Web fallback overlay
│   ├── main.tsx           # React entry
│   └── wailsjs/           # Generated Wails bindings
├── package.json
├── tsconfig.json
└── vite.config.ts

Wails Bindings

frontend/src/wailsjs/ contains auto-generated TypeScript bindings for Go methods:

import { ToggleRecording, GetState } from '../wailsjs/go/main/App';

// Call Go methods from React
await ToggleRecording();
const state = await GetState();

Build Directory

build/
├── appicon.png            # Application icon (PNG)
├── appicon.icns          # macOS icon
├── darwin/               # macOS-specific
│   └── Info.plist        # App metadata
├── windows/              # Windows-specific
│   ├── icon.ico
│   └── installer/        # NSIS installer config
└── bin/                  # Build output

Data Flow

┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│   Hotkey    │────▶│   app.go     │────▶│   Audio     │
│  Detection  │     │  (Wails)     │     │  Recording  │
└─────────────┘     └──────┬───────┘     └──────┬──────┘
                           │                     │
                           ▼                     ▼
                    ┌──────────────┐     ┌─────────────┐
                    │   Frontend   │     │ Transcribe  │
                    │   (React)    │◀────│   Engine    │
                    └──────────────┘     └─────────────┘
                    ┌──────────────┐
                    │  Clipboard   │
                    │  + Paste     │
                    └──────────────┘

Key Technologies

ComponentTechnology
Desktop FrameworkWails v2
BackendGo 1.23
FrontendReact 18 + TypeScript
Build ToolVite
AudioPortAudio
Local Transcriptionwhisper.cpp
Cloud TranscriptionOpenAI API