typeno-voice-input
```markdown
What this skill does
```markdown
---
name: typeno-voice-input
description: TypeNo is a free, open source, privacy-first macOS menu bar app that captures voice via a Control key shortcut, transcribes locally using the coli speech engine, and pastes text into the active app.
triggers:
- set up TypeNo voice input on macOS
- add voice dictation to my Mac app
- integrate TypeNo speech to text
- build TypeNo from source
- configure local voice transcription macOS
- use TypeNo to paste voice input
- fix TypeNo microphone or accessibility permissions
- drag audio file to transcribe with TypeNo
---
# TypeNo Voice Input macOS Skill
> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.
TypeNo is a minimal, privacy-first macOS menu bar app that records your voice on a Control key short-press, transcribes it locally via the [coli](https://github.com/marswaveai/coli) Node.js engine, and pastes the resulting text directly into whatever app is focused — no cloud, no accounts, no UI windows.
---
## What TypeNo Does
- **Global hotkey:** Short-press `Control` (< 300 ms, no modifier) → start/stop recording
- **Local transcription:** All speech processing runs on-device via the `coli` CLI
- **Auto-paste:** Transcribed text is typed into the active app and copied to the clipboard
- **Drag-to-transcribe:** Drop `.m4a`, `.mp3`, `.wav`, or `.aac` onto the menu bar icon
- **No preferences UI:** Zero configuration by design
---
## Installation
### 1. Install the coli speech engine
TypeNo shells out to `coli` for transcription. Install it globally:
```bash
npm install -g @marswave/coli
```
Verify:
```bash
coli --version
```
If `coli` is missing at launch, TypeNo shows an in-app prompt with the install command.
### 2a. Download the pre-built app
```bash
# Download latest release zip from GitHub
# https://github.com/marswaveai/TypeNo/releases/latest
# Download TypeNo.app.zip, unzip, move to /Applications
open /Applications/TypeNo.app
```
If macOS quarantines the app (not yet notarized):
```bash
xattr -dr com.apple.quarantine "/Applications/TypeNo.app"
open /Applications/TypeNo.app
```
Or right-click → **Open** in Finder, then **Open Anyway** in System Settings → Privacy & Security.
### 2b. Build from source
```bash
git clone https://github.com/marswaveai/TypeNo.git
cd TypeNo
scripts/generate_icon.sh # generates app icon assets
scripts/build_app.sh # compiles and bundles to dist/TypeNo.app
cp -R dist/TypeNo.app /Applications/
open /Applications/TypeNo.app
```
### 3. Grant one-time permissions
On first launch TypeNo requests:
- **Microphone** — for audio capture
- **Accessibility** — to simulate paste (⌘V) into the active app
Grant both in **System Settings → Privacy & Security**.
---
## Usage
| Action | How |
|---|---|
| Start recording | Short-press `Control` (< 300 ms, no other keys held) |
| Stop recording & transcribe | Short-press `Control` again |
| Start/stop via menu | Menu bar icon → **Record** |
| Transcribe an audio file | Drag `.m4a` / `.mp3` / `.wav` / `.aac` onto the menu bar icon |
| Check for updates | Menu bar icon → **Check for Updates...** |
| Quit | Menu bar icon → **Quit** (`⌘Q`) |
After stopping, TypeNo:
1. Sends audio to `coli` for local transcription
2. Pastes result into the previously focused app
3. Copies result to the clipboard
---
## Project Structure (Swift source)
```
TypeNo/
├── AppDelegate.swift # NSApplicationDelegate, menu bar setup
├── AudioRecorder.swift # AVFoundation capture logic
├── TranscriptionService.swift # Shells out to `coli` CLI
├── PasteService.swift # Accessibility / CGEvent paste
├── HotkeyMonitor.swift # Global CGEventTap for Control key
├── StatusBarController.swift # NSStatusItem, menu construction
├── DragDropHandler.swift # Drag audio files onto status icon
└── assets/
└── hero.webp
scripts/
├── generate_icon.sh
└── build_app.sh
```
---
## Key Swift Patterns
### Global Control-key hotkey (CGEventTap)
```swift
// HotkeyMonitor.swift
import Cocoa
class HotkeyMonitor {
private var eventTap: CFMachPort?
private var pressStart: Date?
private let maxPressDuration: TimeInterval = 0.3 // 300 ms
func start(onToggle: @escaping () -> Void) {
let mask: CGEventMask = (1 << CGEventType.flagsChanged.rawValue)
eventTap = CGEvent.tapCreate(
tap: .cgSessionEventTap,
place: .headInsertEventTap,
options: .defaultTap,
eventsOfInterest: mask,
callback: { proxy, type, event, refcon in
let monitor = Unmanaged<HotkeyMonitor>
.fromOpaque(refcon!).takeUnretainedValue()
monitor.handle(event: event)
return Unmanaged.passUnretained(event)
},
userInfo: Unmanaged.passUnretained(self).toOpaque()
)
guard let tap = eventTap else { return }
let loop = CFMachPortCreateRunLoopSource(nil, tap, 0)
CFRunLoopAddSource(CFRunLoopGetCurrent(), loop, .commonModes)
CGEvent.tapEnable(tap: tap, enable: true)
}
private func handle(event: CGEvent) {
let flags = event.flags
let onlyControl = flags.contains(.maskControl) &&
!flags.contains(.maskCommand) &&
!flags.contains(.maskAlternate) &&
!flags.contains(.maskShift)
if onlyControl {
pressStart = Date()
} else if let start = pressStart {
let duration = Date().timeIntervalSince(start)
pressStart = nil
if duration < maxPressDuration {
DispatchQueue.main.async { self.onToggle?() }
}
}
}
var onToggle: (() -> Void)?
}
```
### Audio recording with AVFoundation
```swift
// AudioRecorder.swift
import AVFoundation
class AudioRecorder: NSObject {
private var engine = AVAudioEngine()
private var file: AVAudioFile?
private(set) var outputURL: URL?
func startRecording() throws {
let dir = FileManager.default.temporaryDirectory
let url = dir.appendingPathComponent(UUID().uuidString + ".wav")
outputURL = url
let input = engine.inputNode
let format = input.outputFormat(forBus: 0)
file = try AVAudioFile(forWriting: url,
settings: format.settings)
input.installTap(onBus: 0, bufferSize: 4096, format: format) { [weak self] buffer, _ in
try? self?.file?.write(from: buffer)
}
try engine.start()
}
func stopRecording() -> URL? {
engine.inputNode.removeTap(onBus: 0)
engine.stop()
file = nil
return outputURL
}
}
```
### Transcription via coli CLI
```swift
// TranscriptionService.swift
import Foundation
class TranscriptionService {
/// Transcribe a local audio file using the coli CLI.
/// - Parameter url: Path to .wav / .m4a / .mp3 / .aac file
/// - Returns: Transcribed string, or nil on failure
func transcribe(url: URL) async throws -> String {
return try await withCheckedThrowingContinuation { continuation in
let process = Process()
process.executableURL = coliExecutableURL()
process.arguments = ["transcribe", url.path]
let pipe = Pipe()
process.standardOutput = pipe
process.standardError = Pipe()
process.terminationHandler = { _ in
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let result = String(data: data, encoding: .utf8)?
.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
if result.isEmpty {
continuation.resume(throwing: TranscriptionError.emptyResult)
} else {
continuation.resume(returning: result)
}
}
do {
try process.run()
Related in Image & Video
watch
IncludedWatch a video (URL or local path). Downloads with yt-dlp, extracts auto-scaled frames with ffmpeg, pulls the transcript from captions (or Whisper API fallback), and hands the result to Claude so it can answer questions about what's in the video.
physical-ai-defect-image-generation
IncludedUse when the user wants to orchestrate defect image generation, run associated setup, or handle outputs on OSMO. The Day 0 path handles cold-start with USD-to-ROI, image-edit augmentation, and AnomalyGen to create initial PCBA datasets. The Day 1 path performs inference and labeling on real images. This skill helps with first-time asset setup, creation of finetuning checkpoints, and configuring deployment. Trigger keywords: defect image generation, dig workflow, dig pipeline, defect image detection workflow, aoi pipeline, aoi anomalygen, usd2roi anomalygen, day 0 pcba, day 1 pcba, day 1 real-photo alignment, day 1 manual roi, metal surface anomaly, glass defect, anomalygen finetune, setup_pcb, setup_metal, setup_glass, setup_pretrained, dig setup, dig datasets, dig pretrained checkpoint, dig image-edit endpoint.
accelint-react-best-practices
IncludedReact performance optimization and best practices. ALWAYS use this skill when working with any React code - writing components, hooks, JSX; refactoring; optimizing re-renders, memoization, state management; reviewing for performance; fixing hydration mismatches; debugging infinite re-renders, stale closures, input focus loss, animations restarting; preventing remounting; implementing transitions, lazy initialization, effect dependencies. Even simple React tasks benefit from these patterns. Covers React 19+ (useEffectEvent, Activity, ref props). Triggers - useEffect, useState, useMemo, useCallback, memo, inline components, nested components, components inside components, re-render, performance, hydration, SSR, Next.js, useDeferredValue, combined hooks.
elevenlabs-agents
IncludedBuild conversational AI voice agents with ElevenLabs Platform using React, JavaScript, React Native, or Swift SDKs. Configure agents, tools (client/server/MCP), RAG knowledge bases, multi-voice, and Scribe real-time STT. Use when: building voice chat interfaces, implementing AI phone agents with Twilio, configuring agent workflows or tools, adding RAG knowledge bases, testing with CLI "agents as code", or troubleshooting deprecated @11labs packages, Android audio cutoff, CSP violations, dynamic variables, or WebRTC config. Keywords: ElevenLabs Agents, ElevenLabs voice agents, AI voice agents, conversational AI, @elevenlabs/react, @elevenlabs/client, @elevenlabs/react-native, @elevenlabs/elevenlabs-js, @elevenlabs/agents-cli, elevenlabs SDK, voice AI, TTS, text-to-speech, ASR, speech recognition, turn-taking model, WebRTC voice, WebSocket voice, ElevenLabs conversation, agent system prompt, agent tools, agent knowledge base, RAG voice agents, multi-voice agents, pronunciation dictionary, voice speed control, elevenlabs scribe, @11labs deprecated, Android audio cutoff, CSP violation elevenlabs, dynamic variables elevenlabs, case-sensitive tool names, webhook authentication
humanizer
IncludedHumanize AI-generated text by detecting and removing patterns typical of LLM output. Rewrites text to sound natural, specific, and human. Uses 28 pattern detectors, 560+ AI vocabulary terms across 3 tiers, and statistical analysis (burstiness, type-token ratio, readability) for comprehensive detection. Use when asked to humanize text, de-AI writing, make content sound more natural/human, review writing for AI patterns, score text for AI detection, or improve AI-generated drafts. Covers content, language, style, communication, and filler categories.
generating-mermaid-diagrams
IncludedSalesforce architecture diagrams using Mermaid with ASCII fallback. Use this skill when generating text-based diagrams for Salesforce architecture, OAuth flows, ERDs, integration sequences, or Agentforce structure. TRIGGER when: user says "diagram", "visualize", "ERD", or asks for sequence diagrams, flowcharts, class diagrams, or architecture visualizations in Mermaid. DO NOT TRIGGER when: user wants PNG/SVG image output (use generating-visual-diagrams), or asks about non-Salesforce systems.