콘텐츠로 이동

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

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.

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.

SettingWhat it does
Listening range”Office LAN” accepts devices on the same LAN; “This PC only” accepts connections from the same machine.
PortDefaults to 39010 (1024–65535). If you change it, change the port in the URL you enter on each device.
EngineApple Speech Enhanced (requires macOS 26 or later plus the model for your language) or Whisper.
LanguageDefaults to Japanese. Devices that do not specify a language use this one.
Max concurrent jobs1 to 4. With Whisper this is 1, because the shared client processes one job at a time.
Whisper modelChosen from the folder shared with Reki note. Downloading a model once in either app makes it available in both.
LLM relayWhen 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” 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.

  1. Note the URL and shared token from the server’s “Connection info”.
  2. In Reki note open Settings > Transcription and choose “Reki local server transcription”.
  3. Enter the URL in “Server URL”. “Find Reki Server” searches this PC and the LAN and fills in what it finds.
  4. Enter the shared token in “Authentication token”.
  5. 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.

  1. In Reki note open Settings > Data processing and choose “Local endpoint”.
  2. Enter http://<server IPv4>:39010/reki-llm/v1 in “Server URL”.
  3. Enter the shared token in “API key”. You can also leave it empty: Reki note then uses the saved Reki Server token.
  4. Press “Refresh models”, pick a model, and confirm with “Test the connection”.

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.

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.

MethodPathPurpose
GET/reki-sound/v1/healthAPI version, engine readiness, acceptance state, queue counts
POST/reki-sound/v1/transcriptionsSend 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>/ackAcknowledge a finished result
DELETE/reki-sound/v1/jobs/<jobId>Cancel a queued or processing job
POST/reki-sound/v1/clients/heartbeatRecord that a device is present (no audio)
GET/reki-llm/v1/modelsModels offered by the relay target
POST/reki-llm/v1/chat/completionsChat requests relayed to the target (streaming included)
POST /reki-sound/v1/transcriptions?engine=apple-enhanced&language=ja&format=wav
Authorization: Bearer <shared token>
Idempotency-Key: <any key>
X-Reki-Client: MacBook Air
  • engine: apple-enhanced or whisper. Defaults to the server setting, and is rejected when it does not match the engine that is ready.
  • language: a language such as ja or en-US. Defaults to the server setting.
  • format: audio format. Defaults to webm.
  • 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.

ItemValue
Audio formatswav webm m4a mp3 ogg flac mp4
Audio sizeUp to 256MiB
Concurrent uploads4
Queue depth20 waiting jobs
Jobs kept100
Results kept10 minutes after completion (in memory; lost on restart)
Relayed body sizeUp to 32MiB
StatusCodeMeaning
401unauthorizedMissing or wrong token, or an Origin header
400invalid_requestInvalid engine, language, format, or key
404not_found / job_not_foundUnknown path, or unknown job
409idempotency_conflictThe same key was used with different content
409job_not_finishedAcknowledged a job that has not finished
413audio_too_large / request_too_largeAudio or relayed body exceeds the limit
429queue_fullThe queue is at its limit
502upstream_unreachableThe relay target cannot be reached
503engine_not_readyThe engine is not ready
503server_busy / server_stoppingThe server is not accepting work
503relay_not_configuredNo relay target is configured
  • GET /reki-sound/v1/jobs/<jobId> reports the status. When it completes, result carries the same shape as Reki note’s transcription result.
  • When health reports resultAcknowledgement: true, the client acknowledges a parsed result with POST /reki-sound/v1/jobs/<jobId>/ack. Fetching alone does not mark it as received.
  • When health reports idempotencyLookup: true, the client can look up an existing job with GET /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.
  • Only GET /v1/models and POST /v1/chat/completions are 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 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.
  • 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.