{"id":31033021,"url":"https://github.com/uanela/arkos","last_synced_at":"2026-05-17T05:04:13.193Z","repository":{"id":282487656,"uuid":"945990069","full_name":"Uanela/arkos","owner":"Uanela","description":"Arkos.js - The Express And Prisma RESTful Framework","archived":false,"fork":false,"pushed_at":"2026-02-04T15:33:26.000Z","size":155027,"stargazers_count":60,"open_issues_count":28,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-02-05T03:07:32.601Z","etag":null,"topics":["api","express","expressjs","javascript","mongodb","nodejs","postegresql","prisma","prisma-orm","restful-api","typescript"],"latest_commit_sha":null,"homepage":"https://www.arkosjs.com","language":"TypeScript","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/Uanela.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-10T12:49:20.000Z","updated_at":"2026-01-30T17:48:02.000Z","dependencies_parsed_at":null,"dependency_job_id":"2336998d-f34a-48f3-8866-d83d6748c001","html_url":"https://github.com/Uanela/arkos","commit_stats":null,"previous_names":["uanela/arkos"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/Uanela/arkos","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Uanela%2Farkos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Uanela%2Farkos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Uanela%2Farkos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Uanela%2Farkos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Uanela","download_url":"https://codeload.github.com/Uanela/arkos/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Uanela%2Farkos/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29121680,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T10:47:47.471Z","status":"ssl_error","status_checked_at":"2026-02-05T10:45:08.119Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["api","express","expressjs","javascript","mongodb","nodejs","postegresql","prisma","prisma-orm","restful-api","typescript"],"created_at":"2025-09-14T01:04:04.625Z","updated_at":"2026-05-17T05:04:13.179Z","avatar_url":"https://github.com/Uanela.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Header Image](https://www.arkosjs.com/img/arkos-readme-header.webp?v=4)\n\n\u003cdiv align=\"center\"\u003e\n\n[![Socket Badge](https://badge.socket.dev/npm/package/arkos)](https://badge.socket.dev/npm/package/arkos)\n![npm](https://img.shields.io/npm/v/arkos)\n![npm](https://img.shields.io/npm/dt/arkos)\n![GitHub](https://img.shields.io/github/license/uanela/arkos)\n![GitHub Repo stars](https://img.shields.io/github/stars/uanela/arkos)\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003ch2\u003eThe Express \u0026 Prisma RESTful Framework\u003c/h2\u003e\n\u003cp\u003eA tool for backend developers and teams who ship software with complex business logic under tight deadlines\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n**[Installation](https://www.arkosjs.com/docs/getting-started/installation)** •\n**[Documentation](https://arkosjs.com/docs)** •\n**[Website](https://arkosjs.com)** •\n**[Tutorial](https://arkosjs.com/learn)** •\n**[GitHub](https://github.com/uanela/arkos)** •\n**[Blog](https://www.arkosjs.com/blog)** •\n**[Npm](https://www.npmjs.com/package/arkos)**\n\n\u003c/div\u003e\n\n## Quick Start\n\n```bash\nnpm create arkos@latest my-project\n```\n\nYour new project already has JWT auth, customizable CRUD routes, Swagger docs at `/api/docs`, file uploads, validation, and a full security middleware stack. Understand the generated [Project Structure](https://www.arkosjs.com/docs/getting-started/project-structure).\n\n## Your Entry Point\n\n```typescript\n// src/app.ts\nimport arkos from \"arkos\";\nimport postRouter from \"@/src/modules/post/post.router\"; // custom router\n\nconst app = arkos();\n\napp.use(postRouter);\n\napp.listen();\n```\n\nArkos replaces the Express `app` — but it _is_ Express under the hood. You can still use `app.use()`, custom middleware, and raw Express code wherever you need it.\n\n## Creating a Router Beyond Express\n\n```typescript\n// src/modules/post/post.router.ts\nimport { ArkosRouter } from \"arkos\";\nimport CreatePostSchema from \"@/src/modules/post/schemas/create-post.schema\";\nimport postService from \"@/src/modules/post/post.service\";\nimport postPolicy from \"@/src/modules/post/post.policy\"; // Authorization component\n\nconst postRouter = ArkosRouter({ prefix: \"/api/posts\" });\n\npostRouter.post(\n  {\n    path: \"/\", // auto registered into openapi\n    authentication: postPolicy.Create, // Authentication and authorization with RBAC\n    validation: { body: CreatePostSchema }, // auto documented into openapi requestBody\n  },\n  async (req, res) =\u003e {\n    const post = await postService.createOne(req.body); // no error handling need, arkos already handles it\n    res.json({ data: post });\n  }\n);\n\nexport default postRouter;\n```\n\nSee more about the enhanced express-based router (ArkosRouter) at [ArkosRouter Guide](https://www.arkosjs.com/docs/core-concepts/components/routers).\n\n## Define Permissions Once, Guard Everywhere\n\n```typescript\n// src/modules/post/post.policy.ts\nimport { ArkosPolicy } from \"arkos\";\n\nconst postPolicy: ArkosPolicy\u003c\"post\"\u003e = ArkosPolicy(\"post\");\n\npostPolicy.rule(\"Create\", [\"Writer\", \"Admin\"]);\npostPolicy.rule(\"View\", [\"Writer\", \"Admin\", \"User\"]);\n\nexport default postPolicy;\n```\n\nDefine who can do what, once, per resource. Arkos enforces it across every route that references the policy — no scattered middleware, no repeated role checks.\n\n## Automatic CRUD: One Model, Full REST Endpoints\n\n**Define The Prisma model:**\n\n```prisma\nmodel Post {\n  id        String   @id @default(uuid())\n  title     String\n  content   String\n  authorId  String\n  author    User     @relation(fields: [authorId], references: [id])\n  createdAt DateTime @default(now())\n  updatedAt DateTime @updatedAt\n}\n```\n\n**Get a full REST API — instantly:**\n\n```\nPOST   /api/posts        Create a post\nGET    /api/posts        List all posts\nGET    /api/posts/:id    Get a post\nPATCH  /api/posts/:id    Update a post\nDELETE /api/posts/:id    Delete a post\n```\n\nAuthenticated, validated, and documented. Zero boilerplate.\n\n**Customize just like normal router:**\n\n```typescript\n// src/modules/post/post.router.ts\nimport { ArkosRouter, RouteHook } from \"arkos\";\nimport postPolicy from \"@/src/modules/post/post.policy\";\nimport UpdatePostSchema from \"@/src/modules/post/post.schema\";\n\nexport const hook: RouteHook\u003c\"prisma\"\u003e = {\n  findMany: { authentication: false }, // Making GET /api/posts public\n  createOne: { authentication: postPolicy.Create },\n  updateOne: {\n    authentication: postPolicy.Update,\n    validation: { body: UpdatePostSchema },\n  },\n  deleteOne: { authentication: postPolicy.Delete },\n};\n\nconst postRouter = ArkosRouter({ prefix: \"/api/posts\" });\n\nexport default postRouter;\n```\n\nYour auto-generated CRUD routes accept the same config as any ArkosRouter route — authentication, validation, rate limiting, all in one place.\n\n**Add business logic exactly where you need it:**\n\n```typescript\n// src/modules/post/post.interceptor.ts\nimport { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"arkos\";\nimport { BadRequestError } from \"arkos/error-handler\";\n\nexport const beforeCreateOne = [\n  async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) =\u003e {\n    if (req.body.title.length \u003c 5)\n      throw new BadRequestError(\"Title is too short\", \"TitleTooShort\");\n\n    req.body.slug = req.body.title.toLowerCase().replace(/\\s/g, \"-\");\n    req.body.authorId = req.user.id;\n    next();\n  },\n];\n```\n\nName the file, export the hook, and Arkos picks it up automatically. No registration needed.\n\n## What You Stop Building From Scratch\n\n| What you'd normally write                | What Arkos gives you              |\n| ---------------------------------------- | --------------------------------- |\n| JWT setup, refresh tokens, bcrypt        | ✅ Built-in auth system           |\n| 5 route handlers per Prisma model        | ✅ Auto-generated CRUD            |\n| Zod/CV schemas per endpoint              | ✅ Auto generate from your models |\n| Swagger config + schema upkeep           | ✅ Auto-generated OpenAPI docs    |\n| Multer setup + file type validation      | ✅ File upload system             |\n| Rate limiting, CORS, Helmet, compression | ✅ Pre-configured security stack  |\n| **Total setup time**                     | **~5 minutes vs ~8–12 hours**     |\n\n## Documentation\n\nFor comprehensive guides, API reference, and examples, visit our [official documentation](https://arkosjs.com/docs).\n\n**Quick Links:**\n\n- [Getting Started Guide](https://arkosjs.com/docs)\n- [Authentication Setup](https://arkosjs.com/docs/core-concepts/authentication/setup)\n- [Using Interceptors](https://arkosjs.com/docs/core-concepts/components/interceptors)\n- [File Uploads](https://arkosjs.com/docs/guides/file-uploads/setup)\n- [Validation](https://arkosjs.com/docs/guides/validation/setup)\n- [Email Service](https://arkosjs.com/docs/guides/email-service)\n\n## Getting Nightly Updates\n\nYou can get the latest features we're testing before releasing them:\n\n```bash\npnpm create arkos@next my-project\n```\n\n## Built With\n\nArkos.js is built on top of industry-leading tools:\n\n- **[Express](https://expressjs.com/)** - Fast, unopinionated, minimalist web framework for Node.js\n- **[Prisma](https://www.prisma.io/)** - Next-generation ORM for Node.js and TypeScript\n- **[Node.js](https://nodejs.org/)** - JavaScript runtime built on Chrome's V8 engine\n\n## Support \u0026 Contributing\n\n- **Documentation:** [arkosjs.com/docs](https://arkosjs.com/docs)\n- **Bug Reports:** [GitHub Issues](https://github.com/uanela/arkos/issues)\n- **Feature Requests:** Open a GitHub issue\n- **Contact:** [uanelaluiswayne@gmail.com](mailto:uanelaluiswayne@gmail.com)\n\nContributions are welcome! We appreciate all contributions, from bug fixes to new features.\n\n## What Developers Say\n\n\u003e \"Arkos.js changed how I work on the backend: with a Prisma model I already get CRUD routes, auth, and validation out-of-the-box — I saved a lot of time and could focus on business logic.\"\n\u003e\n\u003e **— Gelson Matavela, Founder / Grupo Vergui**\n\n\u003e \"It removes boilerplate and provides a clean structure to build products. Built-in auth is powerful and ready. Automatic CRUD and docs save time, while interceptors allow flexible business logic.\"\n\u003e\n\u003e **— Augusto Domingos, Tech Lead / DSAI For Moz**\n\n\u003e \"With Arkos.js, I can build backends in just a few minutes. It removes the boilerplate and lets me focus entirely on the core logic. Fast, simple, and incredibly productive.\"\n\u003e\n\u003e **— Niuro Langa, Software Developer / SparkTech**\n\n[See more testimonials →](https://arkosjs.com)\n\n## Philosophy\n\nArkos sits between minimal frameworks like Express/Fastify and opinionated ones like NestJS/AdonisJS. It doesn't ask you to learn a new paradigm — it enhances the one most Node.js developers already use, by automating everything that's standardized and staying out of the way everywhere else.\n\nInspired by how Django and Laravel work in their ecosystems: batteries included, nothing forced on you.\n\n\u003e The name \"Arkos\" comes from the Greek word **ἀρχή** _(Arkhē)_, meaning \"beginning\" or \"foundation\".\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n\u003cdiv align=\"center\"\u003e\n\n**[Installation](https://www.arkosjs.com/docs/getting-started/installation)** •\n**[Documentation](https://arkosjs.com/docs)** •\n**[Website](https://arkosjs.com)** •\n**[Tutorial](https://arkosjs.com/learn)** •\n**[GitHub](https://github.com/uanela/arkos)** •\n**[Blog](https://www.arkosjs.com/blog)** •\n**[Npm](https://www.npmjs.com/package/arkos)**\n\nBuilt with ❤️ by [Uanela Como](https://github.com/uanela) and contributors\n\n_The name \"Arkos\" comes from the Greek word \"ἀρχή\" (Arkhē), meaning \"beginning\" or \"foundation\", reflecting our goal of providing a solid foundation for backend development._\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuanela%2Farkos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fuanela%2Farkos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuanela%2Farkos/lists"}