Commit Graph

91 Commits

Author SHA1 Message Date
ycsi b0f01cedea feat(capture): toggle mouse pointer via capture.video.show_pointer (#691)
* feat(capture): toggle mouse pointer via capture.video.show_pointer

- config: register capture.video.show_pointer config option
- config: default pointer to visible (ShowPointer: true) on the
hardcoded fallback pipeline, override applies only when the flag is
explicitly set, so per-pipeline YAML overrides stay untouched
- compose: document NEKO_CAPTURE_VIDEO_SHOW_POINTER example

* fix(capture): apply show_pointer to all pipelines

- capture: thread capture.video.show_pointer into broadcast and
  screencast gstreamer pipelines, previously hardcoded show-pointer=true
  and silently ignored the flag
- config: resolve capture.video.show_pointer once into
  Capture.VideoShowPointer so all pipeline builders share one value
- docs: document capture.video.show_pointer in configuration/capture.md,
  including its reach into broadcast and screencast, and regenerate
  help.txt/help.json
- compose: drop stray commented-out example, default compose file is
  not meant to list every option
2026-08-29 13:47:04 +02:00
KЯØNE a7a217e607 fix: nil pointer panic when destroying webrtc peer in profileChanged (#695)
* This is a no-op with the default configuration: when only a single video pipeline is configured, there is nothing for the stream selector to switch to. The change only has an effect when the operator configures multiple pipelines and enables the bandwidth estimator.

* fix(session): guard against nil WebRTC peer in profileChanged"

---------

Co-authored-by: alvarorichard <alvarorichard@tuta.io>
2026-08-29 13:46:35 +02:00
KЯØNE 4832522228 This is a no-op with the default configuration: when only a single video pipeline is configured, there is nothing for the stream selector to switch to. The change only has an effect when the operator configures multiple pipelines and enables the bandwidth estimator. (#693)
Co-authored-by: alvarorichard <alvarorichard@tuta.io>
2026-08-28 11:24:47 +02:00
Miroslav Šedivý baf21c1d97 feat: remove default configuration to prevend accidental override.
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.
2026-08-15 15:36:06 +02:00
Paul Troeger cc014571cc feat: add openinapp plugin to open chat links in shared neko instance (#682)
* 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>
2026-08-09 22:53:39 +02:00
Abdellatif Anaflous d6a4200b36 feat(filetransfer): allow file deletion and add user delete config option (#683)
* feat(filetransfer): allow file deletion and add user delete config option

* fix(client): make user_delete required boolean in payload

* lint.

* feat(filetransfer): add confirmation dialog for file deletion.

* feat(filetransfer): add delete file confirmation messages in multiple languages

* lint.

---------

Co-authored-by: Miroslav Šedivý <sedivy.miro@gmail.com>
2026-08-07 18:12:02 +02:00
Abdellatif Anaflous 613647c72c fix(filetransfer): allow non-admin file uploads and downloads (#679)
* 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>
2026-08-05 22:33:17 +02:00
Miroslav Šedivý 395ca1a6f6 fix: correct LegacyIsHost boolean logic (#675)
* fix: broken LegacyIsHost method.

* fix: improve LegacyIsHost logic for better access control.
2026-08-05 16:28:51 +02:00
Miroslav Šedivý bce6c57b6a fix: update CORS handling to log warnings for wildcard usage and disable cors by default. (#674) 2026-08-05 16:28:42 +02:00
Budovi dfc41f73d6 Add support for H265 encoded streams (#648)
* 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>
2026-08-04 15:16:33 +02:00
Miroslav Šedivý 827944349b fix: reduce audio jitter buffer latency (#673)
* 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
2026-08-04 14:59:11 +02:00
Miroslav Šedivý db8452416b refactor: replace custom array search utility with slices.Contains for improved readability and performance. 2026-08-04 12:49:38 +02:00
Miroslav Šedivý e6239d6a51 feat: update video encoding to use nvautogpuh264enc for NVIDIA driver 590+ support. (#667) 2026-07-31 14:28:19 +02:00
Miroslav Šedivý baf6eee8a9 fix: prevent overriding video pipelines with legacy settings. (#666) 2026-07-31 14:28:06 +02:00
Miroslav Šedivý 2c124c506e Upgrade go dependencies (#644)
* update pion WebRTC from v3 to v4.

* update mapstructure dependency to use go-viper version.

* update go-chi dependency to v5.
2026-04-25 15:20:43 +02:00
Miroslav Šedivý a545115156 fix regression #639, #638. 2026-04-10 10:58:34 +02:00
Miroslav Šedivý a4f1cfbe0d refactor: standardize constant names and improve goroutine handling across multiple files. 2026-04-08 15:16:47 +02:00
Miroslav Šedivý c54bcf1ee2 fix(api): update profile handling to ensure only the name field is modified. 2026-04-06 20:41:07 +02:00
Hani bc19ab866f feat(client): add microphone passthrough button to controls toolbar (#620)
* 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>
2026-02-17 17:02:51 +01:00
LDwise 76051c47d9 fix(server): include path prefix in legacy API calls (#615) (#618)
Resolves 404 errors by correctly routing legacy requests when a path
prefix is configured.
2026-01-24 10:43:28 +01:00
Miroslav Šedivý ddd5ebfc2c change heartbeat interval from 120 to 10 seconds. #585 2025-09-24 21:00:55 +02:00
Miroslav Šedivý 5b9225f401 add hostname to broadcast variables. (#576) 2025-09-10 22:53:52 +02:00
Miroslav Šedivý 84aa78bfcb desktop: add clipboard command replacement. (#539)
we always keep running the last clipboard function as that is supposed to contain the clipboard data being pasted. as soon as a new one is spawn, the old one is stutdown.
2025-05-28 21:30:58 +02:00
Miroslav Šedivý 3dfd89ec39 forward pong messages, #510. 2025-04-30 21:34:42 +02:00
Miroslav Šedivý 01112c5e8f clipboard: use UTF8_STRING. #517 2025-04-19 10:23:16 +02:00
Miroslav Šedivý b2219396dd disable proxy for local requests, #509. 2025-04-07 19:33:58 +02:00
Miroslav Šedivý 4eec843ed2 https: if we have legacy mode, we need to start local http server too. (#507) 2025-04-06 19:55:35 +02:00
Miroslav Šedivý 007b55a32b add link to docs in V2 configuration warning message. 2025-04-06 17:22:34 +02:00
Miroslav Šedivý 3c787baa40 legacy: forward ws ping messages #506. 2025-04-06 17:19:22 +02:00
Miroslav Šedivý b8bfcaf4bf legacy: fix logging. 2025-04-06 16:19:40 +02:00
Miroslav Šedivý 6c5cd1260d websocket: fix unwrap err. 2025-04-06 16:16:45 +02:00
Miroslav Šedivý 0e3bcedcd4 update config options naming, move scripts to own folder. 2025-04-05 18:24:23 +02:00
Miroslav Šedivý a75424d2f3 generate legacy pipelines when specifying codec. 2025-04-04 08:59:45 +02:00
Miroslav Šedivý 1c63b56b94 legacyhandler: key/button action log only in trace level. 2025-04-03 21:50:09 +02:00
Miroslav Šedivý ec44bf0e04 legacy handler set server bind. 2025-04-03 14:17:47 +02:00
Miroslav Šedivý 51bbad7650 rename package to github name. 2025-03-26 23:51:19 +01:00
Miroslav Šedivý 4eadf996ed enable legacy supprot if at least one legacy config entry is found. 2025-02-20 20:10:07 +01:00
Miroslav Šedivý f8e9c20ff1 enable WebRTC legacy conditionally. 2025-02-20 19:33:57 +01:00
Miroslav Šedivý 33580fe440 add v2 migration configuration docs. 2025-02-19 19:25:10 +01:00
Miroslav Šedivý a7287dca25 cookie add domain & path, change expiration to duration from seconds. 2025-02-17 19:33:52 +01:00
Miroslav Šedivý 004e893921 update agr descs. 2025-02-08 20:12:40 +01:00
Miroslav Šedivý 3082d3241b implement client heartbeat #460. 2024-12-30 13:41:22 +01:00
Miroslav Šedivý 5169e0aad3 fixes issue where url was updated after broadcast was started, #429. 2024-11-07 16:48:29 +01:00
Miroslav Šedivý a569f72087 ignore irrelevant legacy ws events. 2024-09-15 23:07:14 +02:00
Miroslav Šedivý a0565dd295 fix backend response error. 2024-09-09 00:08:21 +02:00
Miroslav Šedivý b7fb738e3a legacy websockets: add mutex. 2024-09-09 00:05:14 +02:00
Miroslav Šedivý 063fa8821f fix legacy capture pipeline. 2024-09-08 23:26:34 +02:00
Miroslav Šedivý 5c91621223 legacy: fix banned ip. 2024-09-08 23:26:17 +02:00
Miroslav Šedivý 6fbdea979f fix duplicate screen sizes. 2024-09-08 19:53:04 +02:00
Miroslav Šedivý e719109116 fix control give. 2024-09-08 19:48:57 +02:00