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

@ivanlog/gs-server

v2.0.4

Published

Server rendering runtime and native Node host for GS applications.

Readme

@ivanlog/gs-server

Server rendering runtime and native Node host for GS 2.0 applications.

Application states, templates and shared services continue to use @ivanlog/gs. Only the final server application and server entrypoint import this package.

The configured shell should contain one <main gs-app></main> mounting root shared with Browser App. SSR replaces this root's children with the current layout and page.

import * as gs from "@ivanlog/gs";
import { AppServer, serve } from "@ivanlog/gs-server";

class ServerApp extends AppServer {
    protected initializeCore(): void {
        gs.StateGS.Configure(states => {
            // Register the same universal route set as Browser App.
        });
    }

    protected async startCore(): Promise<void> {
        // Configure DI and register layouts through this.gui.
    }

    protected resolveLanguage(request: Request): string {
        // Parse application negotiation and return one code, not the complete header.
        return request.headers.get("accept-language")?.split(",", 1)[0]?.split(";", 1)[0] || "en";
    }
}

await serve(new ServerApp(), {
    shell: "./public/index.html",
    assets: "./public",
    host: "127.0.0.1",
    port: 3000,
    publicOrigin: "https://example.com"
});

Set publicOrigin in production when nginx or another reverse proxy terminates HTTPS. GS uses this trusted origin for Request.url, default canonical links, same-origin redirects and SSR cache keys instead of inferring the public scheme and host from the internal Node connection. It must contain only an absolute HTTP(S) origin, for example https://example.com; omit it for a direct local server.

@ivanlog/gs-server requires Node 18 or newer and a matching @ivanlog/gs peer version. It performs anonymous SSR only; authenticated application states remain browser SPA routes. The native host sends a one-year immutable cache header for generated template/CSS fingerprints and versioned browser modules such as gs.2.0.4.min.js and app.1.2.3.min.js. They are served from the configured asset root like every other file under htdocs; no dedicated GS route is required. Every static file advertises Accept-Ranges: bytes. The host supports one bytes range in explicit, open-ended and suffix forms (for example bytes=0-1023, bytes=1024- and bytes=-1024) and streams a successful response as 206 Partial Content. Malformed, unsatisfiable and multiple ranges return 416 Range Not Satisfiable; multipart ranges are intentionally not supported. HEAD follows the same status and header rules without sending a body. Language resolution runs before state, page and layout construction. The selected language is written to the HTML and response headers and forms part of the anonymous SSR cache key.