{"id":41239784,"url":"https://github.com/nicobarray/aquedux","last_synced_at":"2026-04-01T16:48:22.350Z","repository":{"id":42342283,"uuid":"124870101","full_name":"nicobarray/aquedux","owner":"nicobarray","description":"Redux over the wire","archived":false,"fork":false,"pushed_at":"2023-01-04T03:46:43.000Z","size":1359,"stargazers_count":46,"open_issues_count":47,"forks_count":3,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-03-03T14:37:50.329Z","etag":null,"topics":["api","javascript","network","real-time","redux"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nicobarray.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-12T10:09:48.000Z","updated_at":"2024-12-03T12:08:21.000Z","dependencies_parsed_at":"2023-02-01T19:15:55.179Z","dependency_job_id":null,"html_url":"https://github.com/nicobarray/aquedux","commit_stats":null,"previous_names":["winamax/aquedux"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/nicobarray/aquedux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicobarray%2Faquedux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicobarray%2Faquedux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicobarray%2Faquedux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicobarray%2Faquedux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nicobarray","download_url":"https://codeload.github.com/nicobarray/aquedux/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nicobarray%2Faquedux/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31290538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["api","javascript","network","real-time","redux"],"created_at":"2026-01-23T01:15:56.135Z","updated_at":"2026-04-01T16:48:22.330Z","avatar_url":"https://github.com/nicobarray.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv style=\"background-color: yellow;padding:16px;margin: 8px\"\u003e\n  ⚠ Disclamer: This project is not actively maintained anymore. Feel free to take on the idea and improve it if\n  you choose so.\n\u003c/div\u003e\n\n\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"aquedux_logo.png\" alt=\"svgr\" title=\"aquedux\" width=\"500\"\u003e\n\u003c/h1\u003e\n\nRedux over the wire\n\nAquedux is a Redux enhancer that enables seamless real-time synchronization across many JavaScript clients.\n\n[![npm version](https://img.shields.io/npm/v/aquedux-client.svg?style=flat-square)](https://www.npmjs.com/package/aquedux-client)\n[![npm version](https://img.shields.io/npm/v/aquedux-server.svg?style=flat-square)](https://www.npmjs.com/package/aquedux-server)\n[![lerna](https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg)](https://lernajs.io/)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Philosophy\n\nWith Aquedux, you can write your server code with the same logic than your web/native app. No need to\nuse another library that forces you to add GraphQL or RESTfull endpoints. Everything is a Redux app.\n\nAquedux shares your App state across every connected instance. It can be a Node.js microservice, a React app, or anything that can depend on Redux.\n\nIt makes the writing of client and server app easy. There is no need to add another technical layer. If you know how to use Redux, you know how to use Aquedux.\n\nFor more on this, check out:\n\n* This post: [Redux over the wire](https://medium.com/@nbarray/redux-over-the-wire-2a849d618ff5)\n\n* This lightning talk @ ReactEurope 2018: [Lightning Talk](https://www.youtube.com/watch?v=pnb5DV3q8n0)\n\n# Installation\n\n## Aquedux\n\nIf you use Yarn\n```js\n// Client side (aka browser \u0026 Redux app)\nyarn add aquedux-client\n// or\nnpm i aquedux-client\n\n// Server side (aka Node.js \u0026 Redux app)\nyarn add aquedux-server\n// or\nnpm i aquedux-server\n```\n\n## Redis\n\nFor the aquedux-server app to work, you have to install a Redis server on your machine. Don't worry, if you have never installed one, it is extremly simple:\n\n* On OSX: Install it with brew with `brew install redis-server`\n* On Linux: Install it with your system package manager. For instance, if it is apt, with `apt-get install redis-server`\n* On Windows: For windows you have two options, either download it from the redis website, or install it on your `Ubuntu On Windows`.\n\nYou don't have to configure anything, just running it.\nYou should now have a running Redis instance.\n\n# Getting Started\n\nLet see the required steps to integrate Aquedux in your current Redux workflow for the client and the server app.\n\n## The client app\n\n```js\nimport { applyMiddleware } from 'redux'\nimport { createStore, createAquedux, subscribe } from 'aquedux-client'\n\n// The app reducer is shared with the server app.\nimport reducer from './reducers'\n\nconst aquedux = createAquedux({\n  hydratedActionTypes: ['ADD_TODO', 'TOGGLE_TODO'],\n  endpoint: 'http://localhost:3001/aquedux',\n  channels: [ 'todos' ]\n})\n  \nconst store = createStore(reducer, applyMiddleware(aquedux));\n\n/* \n** When subscribing to a channel you are telling Aquedux to receive all related actions in real-time.\n** The first action you receive is the channel's state snapshot.\n** In a real world app, this dispatch should be done in a container/component at route level or cDM.\n*/\nstore.dispatch(subscribe('todos'))\n```\n\n## The server app\n\n```js\nimport { createAqueduxServer, aqueduxMiddleware, aqueduxReducer } from 'aquedux-server'\nimport { createStore, applyMiddleware } from 'redux'\n// The app reducer is shared with the client app.\nimport rootReducer from './reducers'\n\nconst appReducer = combineReducer({\n  ...rootReducer,\n  aquedux: aqueduxReducer\n})\n\nconst todoTypes = ['ADD_TODO', 'TOGGLE_TODO']\n\nconst configureAquedux = (store) =\u003e {\n  const aqueduxOptions = {\n    hydratedActionTypes: todoTypes,\n    secret: 'todoExample'\n  }\n\n  let server = createAqueduxServer(store, aqueduxOptions)\n\n  /*\n  ** The server-side channel definition.\n  **\n  ** It takes a name to identify it (same as for the front-side definition).\n  ** It takes a predicate to filter action types related to it.\n  ** It takes a reducer to translate the desired state into a snapshot for first front-side hydratation.\n  ** The last argument is a key prefix used to store the channels action.\n  */\n  server.addChannel(\n    'todos',\n    action =\u003e todoTypes.indexOf(action.type) !== -1,\n    getState =\u003e {\n      const todos = getState().todos\n      return todos\n    },\n    'todos'\n  )\n\n  return server;\n}\n\n// The middleware who is responsible for the front and back communication.\nconst enhancers = applyMiddleware(fromAquedux.aqueduxMiddleware)\n\nconst store = createStore(appReducer, {}, enhancers)\n\nconst aquedux = configureAquedux(store)\n\naquedux.start('localhost', 3031);\n```\n\nAnd you are good to go! For more help you can check out the example/ directory.\nYou can also check out each package for their API documentation:\n\n* [aquedux-client](https://github.com/winamax/aquedux/blob/master/packages/aquedux-client/README.md)\n* [aquedux-server](https://github.com/winamax/aquedux/blob/master/packages/aquedux-server/README.md)\n\n# FAQ\n\n* Is it used somewhere?\n\nAt [Winamax](https://winamax.fr). It is used on two projects that helped shape Aquedux the way it is. We\nhope that by open-sourcing the project, it will sparkle others to create interesting stuff.\n\n# Authors\n\n* Nicolas Barray ([@nicobarray](https://github.com/nicobarray)) -\n[Ambler](https://www.ambler.fr/)\n* CHaBou ([@chabou](https://github.com/chabou)) -\n[Ambler](https://www.ambler.fr/)\n\n# Thanks\n\n* [William Boulay](https://www.behance.net/crazyouths)  for the awesome logo -\n[Winamax](https://www.winamax.fr/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnicobarray%2Faquedux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnicobarray%2Faquedux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnicobarray%2Faquedux/lists"}