Share transcription and LLM relay with Reki Server
Reki Server is an app distributed separately from Reki note. One app covers two roles for devices on the same LAN: a transcription server, and a relay to an LLM server. Audio is sent to the machine running Reki Server and transcribed there. Its version, updates, and storage are independent of Reki note, so updating Reki note never requires reinstalling it.
Last updated: October 14, 2026
What Reki Server does
Section titled “What Reki Server does”Reki Server has two roles.
- Transcription: it receives audio from devices on the same LAN and transcribes it with the server machine’s engine (Apple Speech Enhanced or Whisper).
- LLM relay: it passes OpenAI-compatible requests from client devices through to the one LLM server you choose (LM Studio, Ollama, and so on). The LLM server runs the model; Reki Server does not run inference.
You can use transcription and relay independently, so a setup with transcription only is also possible. Neither sends anything to a cloud AI service.
If you want everything to stay on your own machine, skip this app and use on-device transcription or a local LLM instead.
Settings on the server
Section titled “Settings on the server”Configure these in the “Server” tab and confirm them with “Save settings” at the bottom right. Settings can only be saved while the server is stopped, and the server cannot start while changes are unsaved.
| Setting | What it does |
|---|---|
| Listening range | ”Office LAN” accepts devices on the same LAN; “This PC only” accepts connections from the same machine. |
| Port | Defaults to 39010 (1024–65535). If you change it, change the port in the URL you enter on each device. |
| Engine | Apple Speech Enhanced (requires macOS 26 or later plus the model for your language) or Whisper. |
| Language | Defaults to Japanese. Devices that do not specify a language use this one. |
| Max concurrent jobs | 1 to 4. With Whisper this is 1, because the shared client processes one job at a time. |
| Whisper model | Chosen from the folder shared with Reki note. Downloading a model once in either app makes it available in both. |
| LLM relay | When enabled, pick the one LLM server to relay to. |
| Startup | ”Launch the app at login” and “Start the server on launch” (on by default) live in the “App settings” tab. |
Start and stop the server with the switch in the bar at the top of the window. Stopping rejects new work and closes the listener once processing and the queue have finished.
On Windows, the first time the server listens you are asked to allow incoming connections. “Allow incoming” adds a firewall rule for the listening port; if you decline, other devices cannot connect. On Mac, macOS may ask for local network access.
Connection info and the shared token
Section titled “Connection info and the shared token”“Connection info” shows the URL and the shared token to enter on each device. Copy them over.
- Transcription URL:
http://192.168.1.10:39010/reki-sound/v1(the server machine’s LAN IPv4 address) - LLM relay URL:
http://192.168.1.10:39010/reki-llm/v1 - Shared token: used by every API. Any device holding the same token can read and cancel every job.
Rotate the token only while the server is stopped. After rotating, devices cannot connect until you enter the new token on them.
Reki Server listens over IPv4. Connecting from the same machine can use 127.0.0.1. IPv6, DNS names, public IPs, credentials inside the URL, and redirects are not supported.
Connecting a device
Section titled “Connecting a device”Use it for transcription
Section titled “Use it for transcription”- Note the URL and shared token from the server’s “Connection info”.
- In Reki note open Settings > Transcription and choose “Reki local server transcription”.
- Enter the URL in “Server URL”. “Find Reki Server” searches this PC and the LAN and fills in what it finds.
- Enter the shared token in “Authentication token”.
- Press “Test the connection and use it”. Once the engine is ready you can start transcribing.
Include the version in the URL (/reki-sound/v1). URLs without a version are rejected.
Use it as the LLM relay target
Section titled “Use it as the LLM relay target”- In Reki note open Settings > Data processing and choose “Local endpoint”.
- Enter
http://<server IPv4>:39010/reki-llm/v1in “Server URL”. - Enter the shared token in “API key”. You can also leave it empty: Reki note then uses the saved Reki Server token.
- Press “Refresh models”, pick a model, and confirm with “Test the connection”.
Devices appear as clients
Section titled “Devices appear as clients”While a connection is configured, Reki note tells the server it is present every 60 seconds. Devices that never send audio still appear under clients. After three missed messages (180 seconds) the server treats the device as disconnected and drops it from the list.
The list shows the name each device reports. It is not per-device authentication or access control: devices sharing the token share the same permissions.
API v1 spec
Section titled “API v1 spec”Authentication and URLs
Section titled “Authentication and URLs”Every API requires Authorization: Bearer <shared token>. Requests carrying an Origin header are rejected, so browsers cannot use the API. Cookies, CORS, redirects, and request-body logging are not supported.
Transcription lives only under /reki-sound/v1 and the LLM relay only under /reki-llm/v1. Paths without a prefix or a version return 404, and /reki-llm does not accept transcription.
Endpoints
Section titled “Endpoints”| Method | Path | Purpose |
|---|---|---|
| GET | /reki-sound/v1/health | API version, engine readiness, acceptance state, queue counts |
| POST | /reki-sound/v1/transcriptions | Send audio and request a transcription (202 with jobId) |
| GET | /reki-sound/v1/jobs/<jobId> | Job status and result |
| GET | /reki-sound/v1/jobs/by-key/<idempotencyKey> | Look up the ID of an accepted job |
| POST | /reki-sound/v1/jobs/<jobId>/ack | Acknowledge a finished result |
| DELETE | /reki-sound/v1/jobs/<jobId> | Cancel a queued or processing job |
| POST | /reki-sound/v1/clients/heartbeat | Record that a device is present (no audio) |
| GET | /reki-llm/v1/models | Models offered by the relay target |
| POST | /reki-llm/v1/chat/completions | Chat requests relayed to the target (streaming included) |
Sending a transcription
Section titled “Sending a transcription”POST /reki-sound/v1/transcriptions?engine=apple-enhanced&language=ja&format=wavAuthorization: Bearer <shared token>Idempotency-Key: <any key>X-Reki-Client: MacBook Airengine:apple-enhancedorwhisper. Defaults to the server setting, and is rejected when it does not match the engine that is ready.language: a language such asjaoren-US. Defaults to the server setting.format: audio format. Defaults towebm.Idempotency-Key: key that folds repeated sends into one job. Letters, digits, and:._-, up to 128 characters.X-Reki-Client: display name of the device, used in the client list.
A successful request returns 202 with {"jobId":"...","reused":false}. Resending the same key, audio, and options returns the existing job with reused: true. The same key with different content returns 409.
Limits
Section titled “Limits”| Item | Value |
|---|---|
| Audio formats | wav webm m4a mp3 ogg flac mp4 |
| Audio size | Up to 256MiB |
| Concurrent uploads | 4 |
| Queue depth | 20 waiting jobs |
| Jobs kept | 100 |
| Results kept | 10 minutes after completion (in memory; lost on restart) |
| Relayed body size | Up to 32MiB |
Errors
Section titled “Errors”| Status | Code | Meaning |
|---|---|---|
| 401 | unauthorized | Missing or wrong token, or an Origin header |
| 400 | invalid_request | Invalid engine, language, format, or key |
| 404 | not_found / job_not_found | Unknown path, or unknown job |
| 409 | idempotency_conflict | The same key was used with different content |
| 409 | job_not_finished | Acknowledged a job that has not finished |
| 413 | audio_too_large / request_too_large | Audio or relayed body exceeds the limit |
| 429 | queue_full | The queue is at its limit |
| 502 | upstream_unreachable | The relay target cannot be reached |
| 503 | engine_not_ready | The engine is not ready |
| 503 | server_busy / server_stopping | The server is not accepting work |
| 503 | relay_not_configured | No relay target is configured |
Receiving results
Section titled “Receiving results”GET /reki-sound/v1/jobs/<jobId>reports the status. When it completes,resultcarries the same shape as Reki note’s transcription result.- When
healthreportsresultAcknowledgement: true, the client acknowledges a parsed result withPOST /reki-sound/v1/jobs/<jobId>/ack. Fetching alone does not mark it as received. - When
healthreportsidempotencyLookup: true, the client can look up an existing job withGET /reki-sound/v1/jobs/by-key/<idempotencyKey>before sending, so a lost response does not force another upload. - Cancel a job you no longer need with
DELETE /reki-sound/v1/jobs/<jobId>. Queued and processing jobs can both be cancelled.
LLM relay
Section titled “LLM relay”- Only
GET /v1/modelsandPOST /v1/chat/completionsare relayed. Other paths are not. - The relay target must be on the same machine or the same network. LLM servers that require authentication are not supported, and the shared token is never forwarded upstream.
- Request and response bodies pass through the server but are never stored or logged. The server records only the time, model name, character count, whether the request streamed, the outcome, time to first byte, total time, response size, and error code. The last 200 entries are kept in memory and cleared on restart, and can be exported to JSON from the screen.
- Stopping the server also stops the relay. An unreachable target returns 502, and an oversized body returns 413. If the client disconnects, the upstream request is aborted too.
Stopping, updates, and data handling
Section titled “Stopping, updates, and data handling”- Stopping rejects new audio. The listener closes once processing and the queue finish, after the finished results are acknowledged or after the 60-second grace period, so in-flight transcriptions are not cut off.
- App updates are applied only while there is no work in the queue.
- Uploaded audio lives in the server’s own storage and is deleted on completion, failure, cancellation, or an interrupted upload. Audio left behind by a crash is deleted on the next launch.
- Jobs and results live in memory only and are lost on restart. The screen never shows transcript text, and audio, transcripts, connection URLs, and the shared token are not sent as telemetry.
When it does not work
Section titled “When it does not work”- The server is not found: check that Reki Server is running, that the listening range is “Office LAN”, and that both machines are on the same network. On Windows check the firewall allowance; on Mac check local network access.
- Connections fail or authentication errors appear: check the port in the URL, the shared token, and that the URL includes the version (
/v1). After rotating the token, enter it again on every device. - “Preparing the model” appears: prepare the engine on the server and start accepting. Whisper needs a downloaded model; Apple Speech Enhanced needs macOS 26 or later and the model for your language.
- Transcription never starts: check that the server is accepting, and that the queue (20 waiting) and job history (100) are not full.
- Relay fails: check that the LLM server is running, that a model is loaded, and that relay is enabled. If the target is another PC, check that machine’s listening settings and firewall too.