{"id":36810143,"url":"https://github.com/my-crazy-lab/remixrun-boilerplate","last_synced_at":"2026-01-12T13:47:04.354Z","repository":{"id":224010770,"uuid":"762065514","full_name":"my-crazy-lab/remixrun-boilerplate","owner":"my-crazy-lab","description":"Clean and Solid boilerplate for Remix","archived":false,"fork":false,"pushed_at":"2024-05-16T11:20:08.000Z","size":976,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-07-14T11:51:46.752Z","etag":null,"topics":["boilerplate","boilerplate-template","higher-order-functions","mongodb","plugin-architecture","rbac","rbac-authorization","react","remix","remix-run","remix-template","shadcn-ui","tailwindcss"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/my-crazy-lab.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":"2024-02-23T02:33:14.000Z","updated_at":"2024-07-14T05:41:02.000Z","dependencies_parsed_at":"2024-03-10T11:24:55.486Z","dependency_job_id":"916e0179-3a8b-44be-a9d8-14263344faf5","html_url":"https://github.com/my-crazy-lab/remixrun-boilerplate","commit_stats":null,"previous_names":["my-crazy-lab/remixrun-boilerplate"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/my-crazy-lab/remixrun-boilerplate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/my-crazy-lab%2Fremixrun-boilerplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/my-crazy-lab%2Fremixrun-boilerplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/my-crazy-lab%2Fremixrun-boilerplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/my-crazy-lab%2Fremixrun-boilerplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/my-crazy-lab","download_url":"https://codeload.github.com/my-crazy-lab/remixrun-boilerplate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/my-crazy-lab%2Fremixrun-boilerplate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28339420,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T12:22:26.515Z","status":"ssl_error","status_checked_at":"2026-01-12T12:22:10.856Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["boilerplate","boilerplate-template","higher-order-functions","mongodb","plugin-architecture","rbac","rbac-authorization","react","remix","remix-run","remix-template","shadcn-ui","tailwindcss"],"created_at":"2026-01-12T13:47:04.246Z","updated_at":"2026-01-12T13:47:04.330Z","avatar_url":"https://github.com/my-crazy-lab.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Clean and Solid boilerplate for Remix\n\n**What is inside?**\n\n- :bulb: [**TypeScript**](https://www.typescriptlang.org/): A language for application-scale JavaScript\n- :heart_decoration: **Back-office Systems Templates**: Typical for enterprise \"backend\" applications\n- :globe_with_meridians: **International**: Built-in i18n solution\n- :gear: **Best Practices**: Solid workflow to make your code healthy\n- :zap: **Router Redirect**: Available Error boundary page\n- :pencil: **Code Conventions**:\n  - [Linter](https://eslint.org/)\n  - [Formatter](https://prettier.io/)\n  - [Spell checker](https://cspell.org/)\n  - [Husky](https://typicode.github.io/husky/)\n  - [Commit-lint](https://commitlint.js.org/)\n- :rocket: **State of The Art Development**: Newest development stacks:\n  - [Zustand](https://zustand-demo.pmnd.rs/)\n  - [Shadcn](https://ui.shadcn.com/)\n  - [React hook form](https://react-hook-form.com/)\n  - [Lodash](https://lodash.com/)\n  - [Momentjs](https://momentjs.com/)\n  - [React 18](https://react.dev/blog/2022/03/29/react-v18)\n  - [Dashboard advanced](https://tanstack.com/table/latest)\n- :ok_hand: **Unit Test**:\n  - Fly safely with unit [Jest](https://jestjs.io/)\n  - 100% coverage.\n- :cyclone: **Available CI/CD**\n\n## Features\n\n- :white_check_mark: **Authentication**: based on [Remix auth](https://github.com/sergiodxa/remix-auth)\n- :white_check_mark: **Role Base Access Control**:\n  - What is [RBAC](https://auth0.com/docs/manage-users/access-control/rbac)?\n  - [Workflow](https://bootcamp.uxdesign.cc/designing-roles-and-permissions-ux-case-study-b1940f5a9aa)\n- :white_check_mark: **Manage action history**\n\n## Code Structure\n\n- **@**: Styles core by [Shadcn](https://ui.shadcn.com/), available Complex Component like [cmdk](https://github.com/pacocoursey/cmdk), [Table](https://tanstack.com/table/latest)\n- **app**: contains the main source code\n  - **constants**: Reusable constants across the application (both client-server)\n  - **hoc**: Store [Higher order function](https://en.wikipedia.org/wiki/Higher-order_function).\n  - **hooks**: Store [React custom hook](https://react.dev/learn/reusing-logic-with-custom-hooks).\n  - **routes**: Core [Remix's routing system](https://remix.run/docs/en/main/discussion/routes)\n  - **services**: [Backend endpoints and logic](https://remix.run/docs/en/main/file-conventions/-server)\n  - **types**: Reuseable for [Typescript](https://www.typescriptlang.org/)\n  - **utilities**: Useful function.\n- **public**: Static assets such as images, fonts.\n- **test**: Unit tests\n- **build**: Output directory for compiled code and assets generated during the build process.\n- **docs**: Documentation files, including READMEs, guides, and API documentation.\n\n## Development mode\n\n### Environment\n\n1. Node 18\n2. Mongodb\n\n### Add hierarchy 1:\n\n```\ndb.getCollection(\"users\").insert(\n  {\n    \"_id\" : \"root\",\n    \"isoCode\": \"VN\",\n    \"username\" : \"superuser\",\n    \"email\" : \"leminh.nguyen@btaskee.com\",\n    \"status\" : \"ACTIVE\"\n  }\n)\n```\n\n```\ndb.getCollection(\"permissions\").insert(\n  {\n    \"_id\" : \"manager\",\n    \"description\" : \"This is manager, can access data all cities of each country, view action history of Team, and manage member\",\n    \"module\" : \"system\",\n    \"name\" : \"Permission: Manager\"\n  }\n)\n\ndb.getCollection(\"roles\").insert({\n    \"_id\" : \"manager\",\n    \"permissions\" : [\n        \"manager\"\n    ],\n    \"name\": \"Role: Manager\",\n    \"status\": \"ACTIVE\"\n})\n```\n\n```\ndb.getCollection(\"permissions\").insert(\n  [\n    {\n      \"_id\" : \"root\",\n      \"description\" : \"This is super user, all powers\",\n      \"module\" : \"system\",\n      \"name\" : \"Super user\"\n    },\n    {\n      \"_id\" : \"write/role-management\",\n      \"description\" : \"Groups management feature: Write roles (create - update - remove)\",\n      \"module\" : \"system\",\n      \"name\" : \"Groups management feature: Write roles (create - update)\"\n    },\n    {\n      \"_id\" : \"read/role-management\",\n      \"description\" : \"Groups management feature: Read roles\",\n      \"module\" : \"system\",\n      \"name\" : \"Groups management feature: Read roles\"\n    },\n    {\n      \"_id\" : \"write/group-management\",\n      \"description\" : \"Groups management feature: Write children groups (create - update - remove)\",\n      \"module\" : \"system\",\n      \"name\" : \"Groups management feature: Write children groups (create - update - remove)\"\n    },\n    {\n      \"_id\" : \"read/group-management\",\n      \"description\" : \"Groups management feature: Read children groups\",\n      \"module\" : \"system\",\n      \"name\" : \"Groups management feature: Read children groups\"\n    },\n    // will remove soon\n    {\n      \"_id\" : \"a-1\",\n      \"description\" : \"Testing: a 1\",\n      \"module\" : \"a\",\n      \"name\" : \"Testing: a 1\"\n    },\n    {\n      \"_id\" : \"a-2\",\n      \"description\" : \"Testing: a 2\",\n      \"module\" : \"a\",\n      \"name\" : \"Testing: a 2\"\n    },\n    {\n      \"_id\" : \"b-1\",\n      \"description\" : \"Testing: b 1\",\n      \"module\" : \"b\",\n      \"name\" : \"Testing: b 1\"\n    },\n     {\n      \"_id\" : \"b-2\",\n      \"description\" : \"Testing: b 2\",\n      \"module\" : \"b\",\n      \"name\" : \"Testing: b 2\"\n    }\n  ]\n)\n\ndb.getCollection(\"roles\").insert({\n    \"_id\" : \"root\",\n    \"permissions\" : [\n        \"root\"\n    ],\n    \"name\":\"Role: Super user\",\n    \"status\": \"ACTIVE\"\n})\n\ndb.getCollection(\"groups\").insert({\n    \"_id\": \"group-superuser\",\n    \"name\" : \"Group: Super user\",\n    \"roleAssignedIds\" : [\n        \"root\"\n    ],\n    \"userIds\" : [\n        \"root\",\n    ],\n    \"genealogy\": [],\n    \"status\": \"ACTIVE\",\n    \"hierarchy\" : NumberInt(1)\n})\n```\n\nBecause this is internal applications, the User cannot register freely. We will create Root account first, and create another user by core workflow. \u003cbr\u003e\nExample:\n\n```\ndb.getCollection(\"users\").insert(\n  {\n    \"_id\" : \"root\",\n    \"isoCode\": \"VN\",\n    \"username\" : \"superuser\",\n    \"email\" : \"leminh.nguyen@btaskee.com\",\n    \"status\" : \"ACTIVE\"\n  }\n)\n```\n\nAfter that, forgot and change password (to match by your .env, because this machine hash password from your key and salt-round).\n\nYou must to verify at your Email to reset password.\u003cbr\u003e\nIf your STMP don't available, you can go to direct link:\n\n```\n`${localhost}/reset-password/${resetPassword.token}`\n```\n\n**Start local**\n\n```sh\nnpm run dev\n```\n\n## Deployment\n\n### Manually\n\nFirst, build your app for production:\n\n```sh\nnpm run build\n```\n\nThen run the app in production mode:\n\n```sh\nnpm run deploy\n```\n\nNow you'll need to pick a host to deploy it to.\n\n### Dockerfile\n\nWe have dockerfile to deploy anywhere you want.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmy-crazy-lab%2Fremixrun-boilerplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmy-crazy-lab%2Fremixrun-boilerplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmy-crazy-lab%2Fremixrun-boilerplate/lists"}