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 🙏

© 2025 – Pkg Stats / Ryan Hefner

ambient-display

v1.1.19

Published

Like a spotify jam but much worse, but also much better. If you need it, you'll love it.

Downloads

40

Readme

Ambient

An ambient display screen for spotify, with the configurable ability to also non destructively add songs to the communal queue and control basic playback.

Screenshot

Watch a userful video here

Like a Spotify Jam?

Yeah pretty much, in fact much worse. But in some ways better. Gives a more 'there is a Spotify instance running by the host, but if you wanna chuck a couple tunes in, go for it' vibe, rather than full control.

It also protects against the DREADED playlist switch. It then also allows the host to disallow jams, it just turns the tighten up a very little amount.

Installing and running

Option 1: Install globally

npm i -g ambient-display // or any package manager of course

SPOTIFY_CLIENT_ID=[ID_HERE] SPOTIFY_CLIENT_SECRET=[SECRET_HERE] ambient

or load a config file from somewhere

CONFIG=~/.ambient/ambient.config.js ambient

This will build the sveltekit project and then run the express server

Option 2: Install in another project [COMING SOON]

Hopefully

Option 3: Pull the project locally

npm run build // or any package manager of course

node server/run.mjs

Config

You can configure Ambient with an ambient.config.js file in the root of the folder. All types can be found in this folder

| Key | Type | Description | Default | | ------------------------------- | ------------ | ------------------------------------------------------------------------------------------------- | ----------------------------------- | | port | number | The port in which the server runs on | 3000 | | origin | string | The origin of the server, usually the local ip | _Your machine's IP address_ | | protocol | string | http:// or https:// (is there another?!) | http:// | | playerRoute | string | The path that the player is routed on | /player | | verbose | boolean | Whether the app shouts a lot more in the stdout | false | | api | object | See below | | | api.market | string | The spotify market to use a lot of the functions in | GB | | api.searchQueryLimit | number | How many search results of each category to display | 10 | | api.centralisedPolling | boolean | Whether to turn the info call onto the server and communicate via websockets | true | | api.centralisedPollingTimer | number | The internal timer that calls for the info | 5000 | | api.canAdd | boolean | Gives users the ability to add to the playback via the dashboard | true | | api.canControl | boolean | Gives users the ability to control the playback | true | | spotify | object | See below | | | spotify.client_id | string | The spotify Client ID from your app | process.env.SPOTIFY_CLIENT_ID | | spotify.client_secret | string | The spotify Client Secret from your app | process.env.SPOTIFY_CLIENT_SECRET | | spotify.routePrefix | string | The prefixed sub route that the spotify mounting sits on | /spotify | | spotify.routeToken | string | The path that spotify redirects to with the token | /token | | spotify.authenticatedRedirect | string | The route that the app redirects too after a successful auth with spotify | / | | spotify.accessTokenJsonLocation | string | The path to save the access token file, for caching | ./server/spotify_auth.json | | spotify.scope | string[] | Any additional scopes to initiate spotify with | [] | | plugins | PluginItem[] | An array of plugins to run | [] | | pluginOptions | object | Refer to any plugin options for what to place here | {} | | suppressErrors | string[] | Any error events to catch and not send to the frontend, because perhaps a plugin will handle them | [] |

Plugins

| Name | Description | | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | | Kiosk Mode | Opens fullscreen kiosk mode of app after running | | Sonos Fallback | Controls sonos directly, if spotify's api errors while using Sonos as playback device |

Reasoning

Spotify's API is excellent, but without being approved for the expanded API grant, its limited to really only hobbyist stuff. This means that you can register your own app, and run this locally and have a customised Spotify Jam scenario, because its running through your credentials. Locally served