{"id":30504948,"url":"https://github.com/victorpopkov/universal-redux","last_synced_at":"2026-04-16T19:36:01.127Z","repository":{"id":40933215,"uuid":"132608806","full_name":"victorpopkov/universal-redux","owner":"victorpopkov","description":"Universal React and Redux web app boilerplate bundled with webpack.","archived":false,"fork":false,"pushed_at":"2024-08-14T20:28:20.000Z","size":5947,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-08-15T22:07:32.015Z","etag":null,"topics":["boilerplate","isomorphic","react","reactstrap","redux","universal"],"latest_commit_sha":null,"homepage":"http://github.victorpopkov.com/universal-redux/","language":"JavaScript","has_issues":true,"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/victorpopkov.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2018-05-08T12:54:22.000Z","updated_at":"2024-08-14T20:28:24.000Z","dependencies_parsed_at":"2024-01-18T20:27:57.488Z","dependency_job_id":"21c0ceec-e7c1-4535-a3a5-5bc27eeade4a","html_url":"https://github.com/victorpopkov/universal-redux","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/victorpopkov/universal-redux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/victorpopkov%2Funiversal-redux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/victorpopkov%2Funiversal-redux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/victorpopkov%2Funiversal-redux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/victorpopkov%2Funiversal-redux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/victorpopkov","download_url":"https://codeload.github.com/victorpopkov/universal-redux/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/victorpopkov%2Funiversal-redux/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272077789,"owners_count":24869310,"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-25T02:00:12.092Z","response_time":1107,"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":["boilerplate","isomorphic","react","reactstrap","redux","universal"],"created_at":"2025-08-25T14:15:01.824Z","updated_at":"2025-10-25T00:37:32.923Z","avatar_url":"https://github.com/victorpopkov.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# universal-redux\n\n[![CI]](https://github.com/victorpopkov/universal-redux/actions/workflows/ci.yml)\n[![CD]](https://github.com/victorpopkov/universal-redux/actions/workflows/cd.yml)\n[![Code Climate]](https://codeclimate.com/github/victorpopkov/universal-redux)\n[![Libraries.io]](https://libraries.io/github/victorpopkov/universal-redux)\n\nUniversal [React] and [Redux] web app boilerplate bundled with [webpack]. As a\nCSS framework, [Bootstrap 5] is used with all components provided by\n[Reactstrap].\n\n- [Features](#features)\n- [Running](#running)\n  - [Development](#development)\n  - [Production](#production)\n- [Configurations](#configurations)\n  - [Environment variables](#environment-variables)\n- [Directory structure](#directory-structure)\n\n## Features\n\n- [x] Based on the [Ducks] pattern\n- [x] Fully isomorphic ([universal-webpack])\n- [x] Fully pre-configured [Bootstrap 5] with [Reactstrap]\n- [x] Hot Module Replacement (HMR)\n- [x] Inline SVGs as React components ([babel-plugin-inline-react-svg])\n- [x] React Router v4 ([react-router])\n- [x] Redux actions use [axios] for requests with requests cancellation support\n- [x] Redux related stuff is built with [Immutable.js] in mind\n- [x] Serve API directly or using proxy\n\n## Running\n\n### Development\n\nTo start coding you just need to:\n\n1. Clone the repository: `https://github.com/victorpopkov/universal-redux.git`\n2. Install packages: `yarn install`\n3. Export `.env.dev` environment variables\n4. Launch: `yarn dev`\n5. Visit in your browser (default: http://localhost:3000)\n\n### Production\n\nIn order to launch the production version you will need to build the project\nfirst before actually starting it:\n\n1. Clone the repository: `https://github.com/victorpopkov/universal-redux.git`\n2. Install packages: `yarn install`\n3. Export `.env.prod` environment variables\n4. Build: `yarn build`\n5. Launch: `yarn start`\n6. Visit in your browser (default: http://localhost:8080)\n\n## Configurations\n\nAll app-specific configurations can be found in the `/config` root directory,\nand most are just the environment variables.\n\n### Environment variables\n\n| Environment variable     | Default                 | Description                                                                                                                                                                     |\n| ------------------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `APP_API_PORT`           | `3030`                  |                                                                                                                                                                                 |\n| `APP_API_PROXY_DISABLED` | `0`                     | Enable or disable API proxy. When the value is set to `1` all other `APP_API_PROXY_*` variables can be safely removed as the app will talk to the API directly.                 |\n| `APP_API_PROXY_PATH`     | `/api`                  | _Only when `APP_API_PROXY_DISABLED` is enabled._                                                                                                                                |\n| `APP_API_PROXY_TARGET`   | `http://localhost:3030` | API proxy target (**without a trailing slash**) used by the [http-proxy]. By default, it points to the current project API.\u003cbr\u003e_Only when `APP_API_PROXY_DISABLED` is enabled._ |\n| `APP_API_TARGET`         | `http://localhost:3030` | API target (**without a trailing slash**).\u003cbr\u003e_Only when `APP_API_PROXY_DISABLED` is enabled._                                                                                  |\n| `APP_BASE_PATH`          |                         | App base path (**without a trailing slash**).                                                                                                                                   |\n| `APP_DEV_SERVER_PORT`    | `3001`                  | [webpack-dev-server] port.\u003cbr\u003e_Only in development mode._                                                                                                                       |\n| `APP_HOST`               | `0.0.0.0`               |                                                                                                                                                                                 |\n| `APP_MORGAN_FORMAT`      | `combined`              | [Morgan] HTTP request logger middleware format.                                                                                                                                 |\n| `APP_PORT`               | `3000`                  |                                                                                                                                                                                 |\n| `APP_PUBLIC_PATH`        | `/`                     | App public path (**with a trailing slash**) to serve static assets and scripts.                                                                                                 |\n\n## Directory structure\n\n```bash\n.\n├── api/\n├── bin/\n│   ├── api.js\n│   └── server.js\n├── build/\n├── config/\n├── src/\n│   ├── app/ # app source\n│   ├── assets/ # global assets\n│   │   ├── images/\n│   │   └── scss/\n│   ├── helpers/\n│   │   ├── ApiClient.js # helper to use `axios` library\n│   │   └── Html.jsx     # helper for HTML Server-Side Rendering (SSR)\n│   ├── middlewares\n│   │   └── client.js # our tiny client middleware\n│   ├── store\n│   │   └── dev-tools.js\n│   │   ├── index.js\n│   ├── client.jsx\n│   ├── reducers.js\n│   ├── routes.js\n│   └── server.jsx\n├── webpack/ # webpack configs\n│   └── webpack-dev-server.js           # development server with HMR configs\n│   ├── dev.base.config.js              # base (development)\n│   ├── dev.client.config.js            # universal-webpack client (development)\n│   ├── dev.server.config.js            # universal-webpack server (development)\n│   ├── paths.js\n│   ├── prod.base.config.js             # base (production)\n│   ├── prod.client.config.js           # universal-webpack client (production)\n│   ├── prod.server.config.js           # universal-webpack server (production)\n│   ├── universal-webpack-settings.json\n└── webpack.base.config.js\n```\n\n## License\n\nReleased under the [MIT License](https://opensource.org/licenses/MIT).\n\n[axios]: https://github.com/axios/axios\n[babel-plugin-inline-react-svg]: https://github.com/airbnb/babel-plugin-inline-react-svg\n[bootstrap 5]: https://getbootstrap.com/\n[cd]: https://img.shields.io/github/actions/workflow/status/victorpopkov/universal-redux/cd.yml?branch=main\u0026label=cd\n[ci]: https://img.shields.io/github/actions/workflow/status/victorpopkov/universal-redux/ci.yml?branch=main\u0026label=ci\n[code climate]: https://img.shields.io/codeclimate/maintainability/victorpopkov/universal-redux\n[ducks]: https://github.com/erikras/ducks-modular-redux\n[http-proxy]: https://github.com/nodejitsu/node-http-proxy\n[immutable.js]: https://immutable-js.com/\n[libraries.io]: https://img.shields.io/librariesio/github/victorpopkov/universal-redux\n[morgan]: https://github.com/expressjs/morgan\n[react-router]: https://github.com/remix-run/react-router\n[react]: https://github.com/facebook/react\n[reactstrap]: https://reactstrap.github.io\n[redux]: https://github.com/reactjs/react-redux\n[universal-webpack]: https://github.com/catamphetamine/universal-webpack\n[webpack-dev-server]: https://github.com/webpack/webpack-dev-server\n[webpack]: https://github.com/webpack/webpack\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvictorpopkov%2Funiversal-redux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvictorpopkov%2Funiversal-redux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvictorpopkov%2Funiversal-redux/lists"}