{"id":20253899,"url":"https://github.com/sumitarora/redux-segment","last_synced_at":"2025-08-30T10:45:08.320Z","repository":{"id":149731298,"uuid":"50148083","full_name":"sumitarora/redux-segment","owner":"sumitarora","description":"Segment.io analytics integration for redux.","archived":false,"fork":false,"pushed_at":"2016-05-09T18:42:43.000Z","size":415,"stargazers_count":1,"open_issues_count":0,"forks_count":64,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-10T09:00:41.125Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sumitarora.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-01-22T01:07:51.000Z","updated_at":"2022-05-23T08:32:35.000Z","dependencies_parsed_at":null,"dependency_job_id":"d909ca96-83b7-45de-9dcf-12e01d0decaf","html_url":"https://github.com/sumitarora/redux-segment","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/sumitarora/redux-segment","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumitarora%2Fredux-segment","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumitarora%2Fredux-segment/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumitarora%2Fredux-segment/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumitarora%2Fredux-segment/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sumitarora","download_url":"https://codeload.github.com/sumitarora/redux-segment/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumitarora%2Fredux-segment/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272839676,"owners_count":25001862,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-30T02:00:09.474Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T10:28:27.297Z","updated_at":"2025-08-30T10:45:08.264Z","avatar_url":"https://github.com/sumitarora.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Redux Segment\n\u003ca href=\"./.tag\"\u003e\u003cimg src=\"./logo.png\" width=\"48\"\u003e\u003c/a\u003e _Segment.io analytics integration for redux._\n\n[![CircleCI](https://img.shields.io/circleci/project/rangle/redux-segment.svg)](https://circleci.com/gh/rangle/redux-segment)\n[![npm](https://img.shields.io/npm/v/redux-segment.svg)](https://www.npmjs.com/package/redux-segment)\n[![GitHub\nlicense](https://img.shields.io/github/license/rangle/redux-segment.svg)](https://github.com/rangle/redux-segment/blob/master/LICENSE)\n\n```\nnpm install --save redux-segment\n```\n\n---\n\u003cimg src=\"./segment.gif\"\u003e\n\n\n## Features\n\n- Send your data to over 100 apps with the flip of a switch (e.g. Google\n  Analytics, Mixpanel, Optimizely, Facebook Ads, Slack, Sentry, and many\nmore...).\n  - You only need one snippet and you can turn integrations on and off\n    whenever you want.\n- Simultaneously load customer data into your data warehouse in minutes.\n  - Query raw data with SQL\n  - Analyze your products across web and mobile.\n  - No API layer, no queue, no transform, no batch, no load...and no\n    infrastructure maintenance costs\n- Out-of-the-box support for popular routers:\n  - [react-router-redux](https://github.com/rackt/react-router-redux) ✝: \u003e=2.1.0 \u003c 5\n  - [redux-router](https://github.com/acdlite/redux-router): ^1.0.3\n- Support for all key Segment specs:\n  - Identify\n  - Page\n  - Track\n  - Group\n  - Alias\n\n✝ Recommended router. You can also trigger page views manually.\n\n\n## Motivation\n\nRedux Segment middleware allows you to draw deep and rich analytics from\nyour Redux application with minimal configuration. You are already\nspecifying the [actions](https://github.com/rackt/redux/blob/master/docs/basics/Actions.md)\nyou care about:\n\n```\nexport function addTodo(text) {\n  return {\n    type: types.ADD_TODO,\n    payload: {\n      text,\n    },\n  }\n}\n```\n\nJust tell the middleware you also want it tracked:\n\n```\nexport function addTodo(text) {\n  return {\n    type: types.ADD_TODO,\n    payload: {\n      text,\n    },\n    meta: {\n      analytics: {\n        eventType: EventTypes.track,\n        eventPayload: {\n          event: types.ADD_TODO,\n          properties: {\n            text\n          },\n        },\n      },\n    },\n  }\n}\n```\n\nOr if you want to save keystrokes:\n\n```\nexport function addTodo(text) {\n  return {\n    type: types.ADD_TODO,\n    payload,\n    meta: {\n      analytics: EventTypes.track,\n    },\n  }\n}\n```\n\nThat's all! :smile:\n\n### What is Segment?\n\n[Segment](https://segment.com) is a platform that allows you to collect\nyour analytics data with one API and send it to hundreds of tools (e.g.\nGoogle Analytics, Mixpanel, Slack, etc...) or data warehousing.\nCrucially, it also allows you to own your data in raw format.\n\n### Can I just write one line that tells the middleware to track everything?\n\nNo. This is tempting to do, especially in Redux where your application\nstate is small and centralized and changes are explicit. You should,\nhowever, resist the temptation. This constraint is core to the **design\nphilosophy** of Redux Segment.\n\n\u003e Analytics is about **learning**\n\u003cimg src=\"https://pbs.twimg.com/media/CTeedmKWEAAtR44.png\"\u003e\n\n-- [@segment](https://twitter.com/segment)\n\nTracking everything, in many cases, is equivalent to tracking nothing at\nall. In practice, we are forced to think about analytics differently.\n\nThe _Lean Startup_ methodology advocates applying a *scientific approach*\nto product development. The rationale, as it goes, is that the faster a\nteam learns, the more likely they are to succeed. The process occurs in\nroughly three phases:\n\n1. Build (idea -\u003e code)\n\n    In phase 1, the team builds something they think their users want. The\nresult is an experimental feature.\n\n2. Measure (code -\u003e data/analytics)\n\n    In phase 2, the team collects data on how users are reacting to the\nfeature. This is the experiment.\n\n3. Learn (data/analytics -\u003e ideas)\n\n    In phase 3, the team uses the data collected to determine if the\nexperiment was a success or not. They can then use what they learned to\ndrive more ideas.\n\nAnd so the cycle continues...\n\n**Redux Segment is designed to allow you to _measure_ faster.** First,\nchoose what you want to learn. Build it. Then, determine how you're\ngoing to measure it. And finally, collect the result.\n\n_You can, of course, still track all actions if you want by explictly\nmarking each one._\n\n\n## Installation\n```\nnpm install --save redux-segment\n```\n\n**1. Create and apply the tracker**\n\n```\nimport { applyMiddleware, createStore, compose } from 'redux';\nimport { reduxReactRouter } from 'redux-router'\nimport createHistory from 'history/lib/createBrowserHistory'\nimport routes from '../routes'\nimport thunk from 'redux-thunk'\nimport api from '../middleware/api'\nimport rootReducer from '../reducers'\nimport { createTracker } from 'redux-segment';\n\nconst tracker = createTracker();                                   // Create the tracker...\n\nconst finalCreateStore = compose(\n  applyMiddleware(thunk, api, tracker),                            // and then apply it!\n  reduxReactRouter({ routes, createHistory })\n)(createStore)\n\nexport default function configureStore(initialState) {\n  return finalCreateStore(rootReducer, initialState)\n}\n```\n_Note: Make sure to include the tracker *after* thunk or promise\nmiddleware so that it sees actual actions._\n\n**2. Optional, Access Third Party Redux Libraries**\nProvide an optional config object to `createTracker(customMapper)` to map third party Redux library ActionTypes to Segment EventTypes and replace out-of-the-box support (if necessary). Note that the mappings can be either simple EventTypes, or mappings to functions if required that returns state information and EventType.\n \n```\nimport { EventTypes } from 'redux-segment'\nconst customMapper = {\n  mapper: {\n    '@@router/CALL_HISTORY_LOCATION': EventTypes.page,\n    '@@router/UPDATE_LOCATION': EventTypes.page,\n    '@@reduxReactRouter/replaceRoutes': (getState) =\u003e {\n      return {\n        eventType: EventTypes.page,\n        eventPayload: {\n            name: ActionType.ADD_TODO,\n            text: getState().text,\n        }\n      }\n    }\n  }\n}\n\nconst tracker = createTracker(customMapper);\n```\n\n\n**2. Copy the segment snippet into the header of your site**\n\n```\n\u003chead\u003e\n  \u003ctitle\u003eMy amazing app\u003c/title\u003e\n  ...\n  \u003cscript type=\"text/javascript\"\u003e\n    !function(){var\n  analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console\u0026\u0026console.error\u0026\u0026console.error(\"Segment\n  snippet included\n  twice.\");else{analytics.invoked=!0;analytics.methods=[\"trackSubmit\",\"trackClick\",\"trackLink\",\"trackForm\",\"pageview\",\"identify\",\"reset\",\"group\",\"track\",\"ready\",\"alias\",\"page\",\"once\",\"off\",\"on\"];analytics.factory=function(t){return\n  function(){var\n  e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return\n  analytics}};for(var t=0;t\u003canalytics.methods.length;t++){var\n  e=analytics.methods[t];analytics[e]=analytics.factory(e)}analytics.load=function(t){var\n  e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=!0;e.src=(\"https:\"===document.location.protocol?\"https://\":\"http://\")+\"cdn.segment.com/analytics.js/v1/\"+t+\"/analytics.min.js\";var\n  n=document.getElementsByTagName(\"script\")[0];n.parentNode.insertBefore(e,n)};analytics.SNIPPET_VERSION=\"3.1.0\";\n    analytics.load(\"YOUR_WRITE_KEY\");\n    // Make sure to remove any calls to `analytics.page()`!\n    }}();\n  \u003c/script\u003e\n\u003c/head\u003e\n```\n\n**3. You're done! You can now start specifying events at your heart's\ncontent.**\n\n## Usage\n\n### Spec API\n\n- [**Identify**](#identify)\n- [**Page**](#page)\n- [**Track**](#track)\n- [**Alias**](#alias)\n- [**Group**](#group)\n\n\n### Overview\n\nIn Redux Segment, events are declared on the action they represent. For\nexample:\n\n```\nimport { EventTypes } from 'redux-segment';\n\nfunction buy(cart, subtotal, tax, total) {\n  return {\n    type: 'CHECKOUT',\n    payload: {\n      cart,\n      subtotal,\n      tax,\n      total,\n    },\n    meta: {\n      analytics: {\n        eventType: EventTypes.track,\n      },\n    },\n  };\n}\n\n// or the short form...\n\nfunction openCart() {\n  return {\n    type: 'OPEN_CART',\n    meta: {\n      analytics: EventTypes.track,\n    },\n  };\n}\n```\n\nEvent specifications are attached the the `analytics` property of the\naction's `meta` key. When using the short-hand, required keys are\ninferred.\n\n**Common Properties:**\n\n*eventType \\\u003cstring\\\u003e* (required) – The type of event to emit. Each type represents\nsome distinct semantic information about your customer.\nAvailable types:\n\n- `EventTypes.identify`: who is the customer?\n- `EventTypes.page`: what web page are they on?\n- `EventTypes.track`: what are they doing?\n- `EventTypes.group`: what account or organization are they part of?\n- `EventTypes.alias`: what was their past identity?\n\nSee the [Segment Spec](https://segment.com/docs/spec/) for more details.\n\n*eventPayload \\\u003cObject\\\u003e* – The fields associated with the event. Each event has a\nfew [common fields](https://segment.com/docs/spec/common/#structure).\nThe rest are covered below, on a type-by-type basis.\n\n\n### Identify\n\n\u003e The identify call ties a customer and their actions to a recognizable\n\u003e ID and traits like their email, name, etc.\n\u003e [Spec: Identify](https://segment.com/docs/spec/identify/)\n\n**Note:** You don't need an `identify` action for anonymous visits. It\nwill be inferred for you so you can ahead and use `page` or `track`\nwithout worry.\n\n**Type:**\n`EventTypes.identify`\n\n**Payload Fields:**\n\n*userId \\\u003cstring\\\u003e* – The database ID of the user. For anonymous\nvisitors, an `anonymousId` will be automatically generated so this field\ncan be omitted.\n\n*traits \\\u003cObject\\\u003e* – A map of attributes about the user. These are\ncompletely at your discretion but common ones include email and name. If\nyou don't provide a userId, the traits will be attributed to the\ncurrently identified users (whether anonymous or not). The following\ntraits are reserved and have standardized meaning:\n\n- `address` \\\u003cObject\\\u003e\n- `age` \\\u003cnumber\\\u003e\n- `avatar` \\\u003cstring\\\u003e\n- `birthday` \\\u003cDate\\\u003e\n- `createdAt` \\\u003cDate\\\u003e\n- `description` \\\u003cstring\\\u003e\n- `email` \\\u003cstring\\\u003e\n- `firstName` \\\u003cstring\\\u003e\n- `gender` \\\u003cstring\\\u003e\n- `id` \\\u003cstring\\\u003e\n- `lastName` \\\u003cstring\\\u003e\n- `name` \\\u003cstring\\\u003e\n- `phone` \\\u003cstring\\\u003e\n- `title` \\\u003cstring\\\u003e\n- `username` \\\u003cstring\\\u003e\n- `website` \\\u003cstring\\\u003e\n\nTraits are also useful for such things as marking users as having seen a\nparticular A/B test variation.\n\n*options \\\u003cObject\\\u003e* – A map of [common\nfields](https://segment.com/docs/spec/common/#structure). This can be\nused to selectively enable or disable certain integrations or set\n`anonymousId` or `userId` on an ad-hoc basis.\n\n\n### Page\n\n\u003e The page call lets you record whenever a user sees a page of your\n\u003e website, along with any properties about the page.\n\u003e [Spec: Page](https://segment.com/docs/spec/page/)\n\n**Type:**\n`EventTypes.page`\n\n**Payload Fields:**\n\n*name \\\u003cstring\\\u003e* – The name of the page (e.g. 'Home').\n\n*category \\\u003cstring\\\u003e* – The category of the page. This is used where page\nnames live under a broader category (e.g. 'Products').\n\u003cu\u003eNote: If you specify a category, you must also provide a name.\u003c/u\u003e\n\n*properties \\\u003cObject\\\u003e* – A map of page properties. The following\nproperties are reserved and have standardized meaning:\n\n- `url`\n- `title`\n- `referrer`\n- `path`\n- `name`\n- `search`\n\nIf not explicitly specified, the above properties are implied. You can\nalso provide your own custom properties, if you want.\n\n*options \\\u003cObject\\\u003e* – A map of [common\nfields](https://segment.com/docs/spec/common/#structure). This can be\nused to selectively enable or disable certain intergrations or set\n`anonymousId` or `userId` on an ad-hoc basis. More routinely, it is\nused to \"backdate\" events by setting the `timestamp` key to when the\nevent actually occurred (as opposed to when the action was dispatched).\nThis is useful for cases where an action may be triggered after a\nsignificant wait (e.g. setTimeout, callback, animations, etc...) and you\nwant to capture the time of human action instead of, say, the time at\nwhich that action was confirmed or some data was persisted.\n\n\n### Track\n\n\u003e The track call is how you record any actions your users perform,\n\u003e along with any properties that describe the action.\n\u003e [Spec: Track](https://segment.com/docs/spec/track/)\n\n**Type:**\n`EventTypes.track`\n\n**Payload Fields:**\n\n*event \\\u003cstring\\\u003e* – The name of the event you’re tracking. This field\nis required but if you don't explicitly provide one, it will be\npopulated by the `type` value of the action\\*. It's recommended that you\nmake event names human-readable and (hopefully) instantly recognizable.\nIt's further recommended that these names be built from a past-tense\nverb and a noun (e.g. 'Bought Merchandise', 'Opened Cart', 'Favorited\nProduct', etc...). The following event names are reserved and have\nstandardized meaning:\n\n\u003cu\u003e[A/B Testing Events](https://segment.com/docs/spec/ab-testing)\u003c/u\u003e\n\n- `Experiment Viewed`\n\u003e This event should be sent every time a customer sees a variation of an\n\u003e active A/B Test.\n\n\u003cu\u003e[Ecommerce Events](https://segment.com/docs/spec/ecommerce)\u003c/u\u003e\n\n- `Viewed Product Category`\n\u003e This event fires when a visitor views a product category. That view\n\u003e might happen on a page or modal.\n\n- `Viewed Product`\n\u003e This event fires when a visitor views a product. That view might\n\u003e happen on a page or preview modal.\n\n- `Added Product` / `Removed Product`\n\u003e Fire the 'Added Product' event when a visitor adds a product to their\n\u003e shopping cart and the 'Removed Product' event when a visitor removes a\n\u003e product from their shopping cart.\n\n- `Completed Order`\n\u003e The final step is to record a 'Completed Order' event when people\n\u003e complete your checkout process.\n\n\\* As of Redux 3.x, all actions MUST define a type property as per\n   [FSA](https://github.com/acdlite/flux-standard-action).\n\n*properties \\\u003cObject\\\u003e* – A map of event properties. Properties are\nextra pieces of information tied to the event being tracked. They can\nhelp provide additional context later when analyzing the events, and in\ndoing so, provide a more complete picture of what your users are doing.\nThe following properties are reserved and have standardized meaning:\n\n- `name` \\\u003cstring\\\u003e (reserved for future use)\n- `revenue` \\\u003cnumber\\\u003e\n- `currency` \\\u003cstring\\\u003e\n- `value` \\\u003cnumber\\\u003e (useful for events with intrinsic, but not monetary,\n  value)\n\n\u003cu\u003e[A/B Testing Events](https://segment.com/docs/spec/ab-testing)\u003c/u\u003e\n\n`Experiment Viewed`\n\n- `experiment_id` \\\u003cstring\\\u003e\n- `experiment_name` \\\u003cstring\\\u003e\n- `variation_id` \\\u003cstring\\\u003e\n- `variation_name` \\\u003cstring\\\u003e\n\n\u003cu\u003e[Ecommerce Events](https://segment.com/docs/spec/ecommerce)\u003c/u\u003e\n\n`Viewed Product Category`\n\n- `category` \\\u003cstring\u003e\n\n`Viewed Product`\n\n- `id`\\* \\\u003cstring\\\u003e\n- `sku`\\* \\\u003cstring\\\u003e\n- `name` \\\u003cstring\\\u003e\n- `price` \\\u003cstring\\\u003e\n- `category` \\\u003cstring\\\u003e\n\n* `id` and `sku` don't have to be different, but they can.\n\n`Added Product` / `Removed Product`\n\n- `id` \\\u003cstring\\\u003e\n- `sku` \\\u003cstring\\\u003e\n- `name` \\\u003cstring\\\u003e\n- `price` \\\u003cstring\\\u003e\n- `quantity` \\\u003cstring\\\u003e\n- `category` \\\u003cstring\\\u003e\n\n`Completed Order`\n\n- `orderId` \\\u003cstring\\\u003e\n- `total` \\\u003cnumber\\\u003e\n- `revenue` \\\u003cnumber\\\u003e\n- `shipping` \\\u003cnumber\\\u003e\n- `tax` \\\u003cnumber\\\u003e\n- `discount` \\\u003cnumber\\\u003e\n- `coupon` \\\u003cstring\\\u003e\n- `currency` \\\u003cstring\\\u003e\n- `products` \\\u003cArray\\\u003e\n\nBe sure to include all `products` in the cart as event properties, with the\nsame properties as listed above (`id`, `sku`, `name`, `price`,\n`quantity` and `category`)\n\n*options \\\u003cObject\\\u003e* – A map of [common\nfields](https://segment.com/docs/spec/common/#structure). This can be\nused to selectively enable or disable certain integrations or set\n`anonymousId` or `userId` on an ad-hoc basis.\n\n\n### Alias\n\n\u003e The alias method is used to merge two user identities, effectively\n\u003e connecting two sets of user data as one.\n\u003e [Spec: Alias](https://segment.com/docs/spec/alias)\n\n**It's important to note that most integrations will automatically alias\nanonymous visitors the first time you dispatch an `EventTypes.identify` action. As\na result, this event is only needed to manage identities in some\nintegrations (e.g.\n[KISSmetrics](https://segment.com/docs/integrations/kissmetrics#alias),\n[Mixpanel](https://segment.com/docs/integrations/mixpanel#alias),\n[Trak](https://segment.com/docs/integrations/trak.io/#alias) and\n[Vero](https://segment.com/docs/integrations/vero#alias).**\n\n**Type:**\n`EventTypes.alias`\n\n**Payload Fields:**\n\n*userId \\\u003cstring\\\u003e* (required) – The new database ID you want associated with the\nuser.\n\n*previousId \\\u003cstring\\\u003e* (required) – The old ID of the user. If omitted, it's\nassumed to be the currently identified user’s ID (in the case of\nanonymous visitors, this is the auto-generated `anonymousId`).\n\n*options \\\u003cObject\\\u003e* – A map of [common\nfields](https://segment.com/docs/spec/common/#structure). This can be\nused to selectively enable or disable certain integrations or set\n`anonymousId` or `userId` on an ad-hoc basis.\n\n\n### Group\n\n\u003e The group API call is how you associate an individual user with a\n\u003e group—be it a company, organization, account, project, team or\n\u003e whatever other crazy name you came up with for the same concept!\n\u003e [Spec: Group](https://segment.com/docs/spec/group)\n\n**Type:**\n`EventTypes.group`\n\n**Payload Fields:**\n\n*groupId \\\u003cstring\\\u003e* (required) – The new database ID of the group you want\nassociated with the (identified or anonymous) user.\n\n*traits \\\u003cObject\\\u003e* – A map of attributes about the group. These are\ncompletely at your discretion but common ones include employees and\nwebsite. The following traits are reserved and have standardized meaning:\n\n- `address` \\\u003cObject\\\u003e\n- `avatar` \\\u003cstring\\\u003e\n- `createdAt` \\\u003cDate\\\u003e\n- `description` \\\u003cstring\\\u003e\n- `email` \\\u003cstring\\\u003e\n- `employees` \\\u003cstring\\\u003e\n- `id` \\\u003cstring\\\u003e\n- `industry` \\\u003cstring\\\u003e\n- `name` \\\u003cstring\\\u003e\n- `phone` \\\u003cstring\\\u003e\n- `website` \\\u003cstring\\\u003e\n\n*options \\\u003cObject\\\u003e* – A map of [common\nfields](https://segment.com/docs/spec/common/#structure). This can be\nused to selectively enable or disable certain integrations or set\n`anonymousId` or `userId` on an ad-hoc basis.\n\n\n## Support\n\nWe're always around to help. If you run into any issues, want advice or\nsimply have a question, please [open an\nissue](https://github.com/rangle/redux-segment/issues/new).\n\n\n## License\n\nCode and documentation copyright 2015-2016 Rangle.io. Code released\nunder the [MIT license](./LICENSE). Docs released under Creative Commons.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsumitarora%2Fredux-segment","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsumitarora%2Fredux-segment","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsumitarora%2Fredux-segment/lists"}