we used to have file neko.yaml with default configuration, but if we would add neko.yml the default configuration would still be read. so instead, default configuartion was moved to the sever itself and no file is distributed with it by defautl.
* feat: add openinapp plugin to open chat links in shared neko instance
* lint.
* feat(openinapp): implement open link handler and route for opening links.
* feat(openinapp): switched to http backend and removed example in docker-compose.yaml
* lint.
---------
Co-authored-by: Miroslav Šedivý <sedivy.miro@gmail.com>
Follows the same pattern as the existing ?volume param. Lets users
bake a preferred scroll sensitivity into the URL (useful for cast/embed
setups where the settings panel isn't reachable), and it's persisted
to localStorage afterwards so it sticks on future visits.
Fixes#607
* fix(filetransfer): remove auth.AdminsOnly middleware wrapper from routes
* fix(filetransfer): add config option to allow non-admin users to download and upload files.
* fix(filetransfer): implement user permissions for file download and upload in client.
---------
Co-authored-by: Miroslav Šedivý <sedivy.miro@gmail.com>
GDK3 (used by Firefox/Camoufox) selects XI2 for the seat keyboard at
startup and ignores core-protocol KeyPress events. XTestFakeKeyEvent
produces core events, so typed characters from the Neko viewer silently
never reach Firefox.
Fix: discover the "Virtual core XTEST keyboard" XInput1 device at
startup, cache it, and dispatch key events via XTestFakeDeviceKeyEvent
which goes through the XI path. Falls back to the old core XTest path
if the device isn't found.
Requires -lXi (libxi-dev at build, libxi6 at runtime).
* Add H265 support
Adds H265 as a selectable video codec with software (x265enc), VAAPI
(vah265enc), and NVENC (nvh265enc) pipeline paths in both the legacy
pipeline builder and the RTPCodec definition.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Replace legacy vaapih264enc with vah264enc
The gstreamer-vaapi plugin suite (vaapih264enc) is superseded by the va
plugin (vah264enc) in gst-plugins-bad. Switch to it and update the
parameters accordingly: CBR instead of VBR for lower-latency streaming,
key-int-max instead of keyframe-period, and target-usage instead of
quality-level.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Unify keyframe interval to 60 frames for NVENC H264/H265 encoder paths
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: reduce audio jitter buffer latency
- Release listenersMu before dispatching samples to listeners
- Buffer Track.sample channel (size 2) with non-blocking WriteSample
- Buffer pipeline.sample channel (size 4) to unblock GStreamer thread
- Add leaky=downstream max-size-buffers=5 to audio queue to prevent burst accumulation
- Set sync=false on appsink to deliver buffers immediately without clock wait
These changes break the backpressure chain that caused the GStreamer
streaming thread to stall. When the Go scheduler has a hiccup, buffered
frames were delivered in a burst, causing the browser audio jitter buffer
to grow to ~10 seconds over time.
Fixes: #598
* fix: log message when dropping samples due to full track channel
* feat: add latest version check and update logic for GHCR workflows.
* feat: implement latest version checks in GHCR workflows and update related logic.
- Added missing translation keys across all language files
- Completed file_transfer lock translations for all locales
- Added missing control section translations (has/hasnot)
- Fixed inconsistent translations and improved accuracy
- Ensured all locale files match the English key structure
- Corrected grammar errors and typos in various languages
- Added broadcast_title, reconnecting, kicked translations
- Standardized translation quality across all supported languages
Languages updated: zh-cn, es-sp, fr-fr, de-de, ja-jp, ko-kr, ru-ru,
fi-fi, sv-se, nb-no, sk-sk
* feat(client): add microphone passthrough button to controls toolbar
Add mic toggle button to the bottom controls bar that enables users to
share their local microphone with the remote neko session via WebRTC.
The server already supports microphone capture (capture.microphone.enabled)
but the legacy client had no UI to trigger getUserMedia and send an audio
track to the peer connection.
Changes:
- base.ts: Add enableMicrophone/disableMicrophone methods that call
getUserMedia and addTrack/removeTrack on the RTCPeerConnection.
Mic is cleaned up automatically on disconnect.
- controls.vue: Add mic button (fa-microphone/fa-microphone-slash) between
play/pause and volume controls with tooltip and error handling.
- en-us.ts: Add i18n strings for mic tooltips and error dialog.
* if the error is not io.EOF, log it. Otherwise, it's a normal closure of the track.
* tie microphone to active host and auto-disable on control loss
---------
Co-authored-by: h1n054ur <admin@haniumer.com>
Co-authored-by: Miroslav Šedivý <sedivy.miro@gmail.com>