npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

scrypted-reolink-neolink-talkback

v0.0.2

Published

Reolink talkback mixin for Scrypted using Neolink

Readme

Reolink Neolink Talkback

This Scrypted plugin adds Reolink talkback to an existing camera as an Intercom mixin. Import the camera with ONVIF first, then enable this extension on that camera. The original camera plugin continues to provide video, snapshots, motion, and HomeKit export.

Current Status

This repository captures the current working deployment baseline:

  • tested on Scrypted with a Reolink RLC-811A
  • camera imported through the Scrypted ONVIF plugin
  • HomeKit talkback routed to this mixin
  • audio decoded by Scrypted FFmpeg to a 16 kHz mono WAV stream
  • WAV stream piped to neolink talk through stdin
  • Neolink input source: fdsrc fd=0 ! wavparse

The plugin code is intentionally small. It does not replace the camera plugin and does not implement the Reolink talkback protocol itself; it only bridges the Scrypted/HomeKit talkback audio into Neolink.

Compatibility

This plugin has been tested with a Reolink RLC-811A exposed to Scrypted through the ONVIF plugin. Other Reolink models may work if Neolink supports their talkback path, but they have not been verified for this plugin yet.

Talkback is delegated to a local neolink talk process. The plugin expects:

  • a Neolink binary with GStreamer support
  • a Neolink config file containing the target Reolink camera
  • GStreamer support for fdsrc and wavparse

Scrypted hands HomeKit talkback to this plugin as a temporary RTSP audio source. The plugin uses Scrypted FFmpeg to decode that stream to a 16 kHz mono WAV stream and pipes it into Neolink over stdin after Neolink reports that its talkback GStreamer pipeline is ready. Neolink reads stdin with this default GStreamer source:

fdsrc fd=0 ! wavparse

That keeps GStreamer away from HomeKit's temporary RTP/Opus RTSP details.

Leave Volume at 1.0 or below. The plugin caps Neolink volume above 1.0 because higher Neolink GStreamer volume values can produce unusable camera talkback on some Reolink models. Use FFmpeg Gain for extra loudness instead; it applies a gain stage while FFmpeg produces the WAV stream.

Installation Paths

There are three realistic installation paths, depending on how far the package has been published and how Scrypted is running.

Scrypted Plugin Installer

Once the package is published to npm, install it in Scrypted by package name:

scrypted-reolink-neolink-talkback

This is the target end-user path. For inclusion in Scrypted's public/community plugin discovery, the usual next step is to publish the npm package and then ask for review in the Scrypted project/community channels or open the matching plugin index/catalog change if Koush prefers that route. Because this plugin depends on an external Neolink binary and system GStreamer libraries, it should be presented as an integration plugin with explicit runtime prerequisites rather than as a fully self-contained camera driver.

Local Development Deploy

For local development, clone this repository on a development machine and deploy the plugin to a running Scrypted server:

npm install
npm run tsc
npm run build
npm run scrypted-deploy <scrypted-ip>

This deploys only the Scrypted plugin bundle. It does not install Neolink or GStreamer into the Scrypted runtime.

Manual Runtime Install

The plugin needs neolink and GStreamer in the same runtime that launches the Scrypted plugin process. The right installation method depends on the Scrypted deployment model.

Bare Metal

Install Neolink and the required GStreamer packages directly on the host that runs Scrypted. Configure Neolink Executable as either neolink if it is on PATH, or as the absolute binary path.

LXC Without Docker

Install Neolink and GStreamer inside the LXC container, not only on the Proxmox host. The plugin process can only execute binaries and read files visible inside that container.

Docker

Neolink, its config file, and the needed GStreamer runtime libraries must be available inside the Scrypted container. Installing Neolink only on the Docker host is not enough.

Durable options include:

  • build a small custom Scrypted image that adds Neolink and GStreamer
  • bind-mount a Neolink binary and config into the container, if all required shared libraries are also available there
  • run a startup or maintenance step that installs the packages after container recreation

Proxmox LXC With Docker

Some Scrypted Proxmox LXC installs run Scrypted in Docker inside the LXC. In that model there are three layers to keep straight:

  • Proxmox host
  • LXC guest
  • Scrypted Docker container

The plugin runs in the Scrypted Docker container, so that container must be able to execute Neolink and load GStreamer. Installing Neolink only on the Proxmox host or only in the LXC guest will not help unless it is also mounted or installed into the container.

The developer-provided Scrypted Proxmox LXC Docker script has been observed to generate a /root/.scrypted/docker-compose.sh start script that intentionally runs:

docker compose pull
docker compose up --force-recreate

For that setup, manual changes made inside the running Scrypted container can be lost on restart. Choose one maintenance model and document it locally:

  • keep the upstream --force-recreate behavior and provide Neolink through a persistent image, mount, or reinstall step
  • remove --force-recreate from the local start script if preserving manual container changes is preferred over fresh-container startup behavior

For example, change:

docker compose up --force-recreate

to:

docker compose up

That second option changes local Scrypted startup behavior. Review the generated script before editing it and keep a note of the change for future Scrypted installer resets or repairs.

Install Neolink

Install a Neolink build with GStreamer talkback support in the same runtime that launches the Scrypted plugin. The maintained Neolink project is at https://github.com/QuantumEntangledAndy/neolink. The original project is at https://github.com/thirtythreeforty/neolink and points to the maintained fork.

Follow the Neolink install instructions for your CPU architecture and operating system, including the required GStreamer packages. This plugin does not download or bundle Neolink because Neolink and GStreamer are native runtime dependencies.

The most important rule is that Neolink must be installed where the Scrypted plugin process can execute it:

  • bare metal Scrypted: install Neolink on the same host that runs Scrypted
  • LXC Scrypted: install Neolink inside the LXC guest
  • Docker Scrypted: install or mount Neolink inside the Scrypted container
  • Proxmox LXC with Docker: install or mount Neolink inside the Scrypted Docker container, not only on the Proxmox host or LXC guest

From the same runtime, Neolink must be able to run:

neolink talk --help

For Docker-based Scrypted installs, enter the Scrypted container first and run the check there. The container name varies by installation:

docker exec -it scrypted sh
which neolink
neolink talk --help

Create a Neolink config.toml with the target Reolink camera. The exact config format is owned by Neolink and may change, so prefer Neolink's sample config and documentation. A minimal shape looks like this:

[[cameras]]
name = "FrontDoor"
username = "admin"
password = "your-camera-password"
address = "192.168.1.50:9000"

For battery cameras or other Neolink-supported modes, follow the Neolink docs for uid and network requirements instead of copying the address example blindly.

Verify Neolink talkback outside Scrypted before debugging HomeKit. The camera name at the end of the command must exactly match the name in config.toml. A simple GStreamer test source is useful:

neolink talk --config /etc/neolink/config.toml --microphone \
  --input-src "audiotestsrc wave=sine freq=880 num-buffers=120" FrontDoor

When that works, use the same paths in the Scrypted plugin settings. Example values:

  • Neolink Executable: /usr/local/bin/neolink
  • Neolink Config: /etc/neolink/config.toml
  • Neolink Camera Name: FrontDoor
  • Neolink Input Source: fdsrc fd=0 ! wavparse

If neolink is on PATH inside the Scrypted runtime, Neolink Executable can also be just neolink. If Scrypted runs in Docker, all paths are container paths, not host paths.

Configure Scrypted

  1. Add the camera to Scrypted with the ONVIF plugin.
  2. Keep ONVIF two way audio enabled if the ONVIF plugin needs it to advertise Intercom before extensions are applied.
  3. Install this plugin and enable the Reolink Neolink Talkback extension on the ONVIF camera.
  4. Fill in Neolink Executable, Neolink Config, and Neolink Camera Name. Use paths as seen by the Scrypted runtime, for example /usr/local/bin/neolink, /etc/neolink/config.toml, and FrontDoor.
  5. Keep Neolink Input Source at fdsrc fd=0 ! wavparse unless a different stdin source is required in that runtime.
  6. Keep Volume at 1.0 or below and use FFmpeg Gain for controlled loudness tuning.
  7. Export the same ONVIF camera to HomeKit and test the talk button.

After updating the plugin or changing mixin wiring, disabling and re-enabling the extension on the camera may be needed before the new intercom path is used.

This mixin does not change the ONVIF video path. It only replaces the intercom handler Scrypted/HomeKit calls when talkback starts.

Troubleshooting

Talkback Is Silent On The First Try

During testing with the RLC-811A, talkback was sometimes not audible on the first HomeKit stream attempt even though reopening the camera stream and trying again worked. Closing the HomeKit stream, opening it again, and pressing talk again is the current workaround.

The observed Scrypted logs use the Rebroadcast/Prebuffer path for the HomeKit camera stream while this plugin receives a separate temporary HomeKit talkback audio input and feeds that audio into Neolink. That means Rebroadcast may be part of the timing around stream startup, but the logs collected so far do not prove that Rebroadcast is the talkback failure cause.

The plugin waits for Neolink to log its talkback GStreamer pipeline before it starts decoding the HomeKit talkback input. That avoids feeding HomeKit audio into Neolink while the camera talkback process is still connecting.

Check the plugin log for these steps before focusing on camera audio volume:

  • Starting Neolink talkback.
  • Neolink talkback pipeline is ready. Starting FFmpeg input.
  • Starting FFmpeg talkback decoder.
  • Neolink login succeeds and prints the GStreamer pipeline.
  • FFmpeg emits WAV output progress instead of exiting immediately.

Credits

Thanks to the Neolink developers, especially George Hilliard and Andrew King, for the Neolink project and the Reolink Baichuan talkback work this plugin uses. This plugin does not implement the camera talkback protocol itself; it launches Neolink to do that work.

Thanks also to Koush and the Scrypted project for the plugin platform, ONVIF and HomeKit integrations, and the extension model that makes this kind of small bridge possible.

License And Warranty

This Scrypted plugin is licensed under the MIT License. See LICENSE.

Neolink is a separate project licensed under AGPL-3.0-or-later. This plugin does not vendor a Neolink binary or Neolink source code. Users must obtain and configure Neolink separately and must follow Neolink's license for Neolink itself.

This plugin is provided without warranty. It is an unofficial integration and is not affiliated with Reolink, Scrypted, or Neolink.