Updates/sets the browser's query string in place without adding to browser history.
Last updated 3 years ago by henrikjoreteg .
MIT · Repository · Bugs · Original npm · Tarball · package.json
$ cnpm install set-query-string 
SYNC missed versions from official npm registry.


Updates/sets the browser's query string in-place without adding to browser history (unless you want to, of course).

This module uses HTML5's history.replaceState to manipulate the query string on the page without refreshing the page.

If not supported in your browser it's just a no-op.

This is just a thin wrapper on top of the awesome and tiny query-string module.

Why would you want this?

Sometimes you want to let the user apply filters to data in your Native Web App (a.k.a. Single Page App) and still make those filters deep-linkable. So what do you do?

Serialize your filter description into the URL:

Now the user can deep link or bookmark specific filtered views.

In browsers that don't support replaceState using this simply does nothing so your app still works, users simply can't deep-link your filtered views ¯_(ツ)_/¯.

Why bother making it a module?

Because it's nice to just be able to set an object and have it Just Work™ without having to think about installing a query string parser, etc.

Also, this automatically URI encodes/decodes values so you can use spaces and whatnot without having to think about it.


npm install set-query-string


var setQuery = require('set-query-string');

// the browser's URL will be updated
// in place without a page refresh:

// before: ``
setQuery({something: 'else'})
// after: ``

// by default any other query strings are left in place
// before: ``
setQuery({other: 'value'})
// after: ``

// you can optionally clear other values too
// before: ``
setQuery({other: 'value'}, {clear: true})
// after: ``

// by default it uses `history.replaceState` so
// the changed URL doesn't end up being part of the
// "back" button history. If you *do* want to add
// to it, just pass a `pushState: true` option
setQuery({other: 'value'}, {pushState: true})

// setting values to anything falsy other than `0` removes that key
// from the query entirely.
// if there's no keys left, the `?` is removed too
// before: ``
// these are all the same
setQuery({other: ''})
setQuery({other: undefined})
setQuery({other: null})
// after: ``

// if for some reason you want to encode the string yourself
// go for it, just pass it a string instead of an object
var myQueryString = '?im-special=yup'
// this works too, if you really want it (always replaces the entire query string)
// it ignores leading `?` if you include it, so it's safe to do it either way

// setting query string and adding to history state
setQuery({other: 'value'}, {pushState: true, state: {other: 'value'}})

binding to model property

If you happen to be using something like ampersand-state you can use this module to easily bind a model property to a certain query paramater quite easily:

import State from 'ampersand-state'
import setQuery from 'set-query-string'

export default State.extend({
  initialize () {
    // bind `query` property to browser URL query
    this.on('change:query', (model) => setQuery({query: model.query}))

  session: {
    query: 'string'


Works well in the apps I use it in. I'd happily take a PR that added some but it's simple enough and don't have the time right now ¯_(ツ)_/¯


If you like this follow @HenrikJoreteg on twitter.


  • 2.1.0: now inert if required in non browser environment
  • 2.0.0: use smaller, simpler query-string instead of qs
  • 1.0.0: initial release



Current Tags

  • 2.2.0                                ...           latest (3 years ago)

4 Versions

  • 2.2.0                                ...           3 years ago
  • 2.1.0                                ...           5 years ago
  • 2.0.0                                ...           5 years ago
  • 1.0.0                                ...           5 years ago
Maintainers (1)
Today 0
This Week 0
This Month 1
Last Day 0
Last Week 0
Last Month 2
Dependencies (1)
Dev Dependencies (0)
Dependents (1)

Copyright 2014 - 2016 © |