ljharb

    ljharb/qs

    A querystring parser and serializer with nesting support

    9.0K stars
    976 forks
    9.0K GitHub watchers
    Updated Nov 3, 2026
    View on GitHub

    Build with Backblaze B2

    SDKs, agent skills, IDE extensions, and reference pipelines from Backblaze Labs. All open source.

    Explore Backblaze Labs

    Loading star history...

    Where it stands

    Rank, growth pace and release cadence relative to everything GStars tracks.

    The project lists 80 contributors on GitHub.

    Gained 33% fewer stars in the last 90 days than in the 90 days before.

    Use Cases & Benefits

    • Parses and serializes query strings with support for nested objects and arrays in JavaScript environments.
    • Provides extensive customization options and security features like depth limits and prototype pollution prevention.
    • Use for safely parsing complex nested query parameters in Node.js or browser applications.
    • Use for generating query strings from deeply nested JavaScript objects with customizable encoding and formatting.
    • Use for handling legacy character sets and encoding schemes in query strings, including iso-8859-1 and Shift JIS.

    Should you depend on it?

    License terms, project hygiene and risks, from GitHub metadata and GStars' snapshots.

    License

    BSD 3-Clause

    Permissive: commercial use, modification and redistribution are allowed with attribution.

    Community files

    • README: present
    • Contributing guide: present
    • Code of conduct: present

    Watch-outs

    • No GitHub releases; pin a commit or tag instead of a release.

    General guidance from repository metadata, not legal advice. How we score

    From the README

    A querystring parsing and stringifying library with some added security.

    The qs module was originally created and maintained by TJ Holowaychuk.

    qs allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets []. For example, the string 'foo[bar]=baz' converts to:

    When using the plainObjects option the parsed value is returned as a null object, created via { __proto__: null } and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like:

    By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use plainObjects as mentioned above, or set allowPrototypes to true which will allow user input to overwrite those properties. WARNING It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option.

    Excerpt from the ljharb/qs README on GitHub (BSD-3-Clause license). © its authors.Read the full README on GitHub

    Daily snapshots

    Stars gained per day, and how forks and open issues moved, from GStars' daily snapshots

    Forks

    976+83

    Open issues

    42-49

    Compared with peers in Backend

    Fastest-growing repositories GStars tracks in this cohort for the week of Nov 8, by 7-day star growth

    ljharb/qs compared with Backend repositories by stars, 7-day star growth, health score and last release
    RepositoryStars+7dHealthLast release
    anthropics/skills192.3K+5.2K75—
    zed-industries/zed94.7K+2.3K756 days ago
    google/skills23.8K+2.0K75—
    NationalSecurityAgency/ghidra99.4K+1.8K7519 days ago
    DuarteSantos8/openGym20.8K+1.7K757 days ago
    ljharb/qs9.0K—45—
    Category median94.7K+2.0K75—

    Discover Repositories

    Search across tracked repositories by name or description