{"id":27471080,"url":"https://github.com/honestjs/honest","last_synced_at":"2026-04-02T00:02:14.361Z","repository":{"id":288046573,"uuid":"966304321","full_name":"honestjs/honest","owner":"honestjs","description":"HonestJS - a modern web framework built on top of Hono","archived":false,"fork":false,"pushed_at":"2026-03-27T23:51:20.000Z","size":291,"stargazers_count":85,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-03-28T02:22:56.314Z","etag":null,"topics":["bun","deno","framework","honest","honestjs","hono","javascript","nest","node","nodejs","typescript","web-framework"],"latest_commit_sha":null,"homepage":"https://honestjs.dev","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/honestjs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-04-14T18:05:52.000Z","updated_at":"2026-03-27T23:50:42.000Z","dependencies_parsed_at":"2025-05-01T19:02:54.959Z","dependency_job_id":"5847d404-35c0-4e24-9694-8b4191a5d3a8","html_url":"https://github.com/honestjs/honest","commit_stats":null,"previous_names":["honestjs/honest"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/honestjs/honest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/honestjs%2Fhonest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/honestjs%2Fhonest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/honestjs%2Fhonest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/honestjs%2Fhonest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/honestjs","download_url":"https://codeload.github.com/honestjs/honest/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/honestjs%2Fhonest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31293147,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","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":["bun","deno","framework","honest","honestjs","hono","javascript","nest","node","nodejs","typescript","web-framework"],"created_at":"2025-04-16T01:38:41.977Z","updated_at":"2026-04-02T00:02:14.190Z","avatar_url":"https://github.com/honestjs.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/honestjs/\" target=\"blank\"\u003e\u003cimg src=\"https://honestjs.dev/images/honestjs.png\" width=\"120\" alt=\"Honest.js Logo\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\nA modern, TypeScript-first web framework built on top of \u003ca href=\"https://hono.dev/\" target=\"blank\"\u003eHono\u003c/a\u003e, designed for building scalable and\nmaintainable web applications. Honest combines the elegance and architecture of \u003ca href=\"https://nestjs.com/\" target=\"blank\"\u003eNest\u003c/a\u003e with the\nultra-fast performance of Hono, giving you the best of both worlds.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"https://github.com/honestjs/website\"\u003e\n\t\t\u003cu\u003ewebsite\u003c/u\u003e\n\t\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"https://github.com/honestjs/examples\"\u003e\n\t\t\u003cu\u003eexamples\u003c/u\u003e\n\t\u003c/a\u003e\n\t|\n\t\u003ca href=\"https://github.com/honestjs/templates\"\u003e\n\t\t\u003cu\u003etemplates\u003c/u\u003e\n\t\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"https://github.com/honestjs/middleware\"\u003e\n\t\t\u003cu\u003emiddleware\u003c/u\u003e\n\t\u003c/a\u003e\n\t|\n\t\u003ca href=\"https://github.com/honestjs/guards\"\u003e\n\t\t\u003cu\u003eguards\u003c/u\u003e\n\t\u003c/a\u003e\n\t|\n\t\u003ca href=\"https://github.com/honestjs/pipes\"\u003e\n\t\t\u003cu\u003epipes\u003c/u\u003e\n\t\u003c/a\u003e\n\t|\n\t\u003ca href=\"https://github.com/honestjs/filters\"\u003e\n\t\t\u003cu\u003efilters\u003c/u\u003e\n\t\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"https://github.com/honestjs/http-essentials\"\u003e\n\t\t\u003cu\u003ehttp-essentials\u003c/u\u003e\n\t\u003c/a\u003e\n\u003c/p\u003e\n\n\u003chr /\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![GitHub](https://img.shields.io/github/license/honestjs/honest)](https://github.com/honestjs/honest/blob/main/LICENSE)\n[![npm](https://img.shields.io/npm/v/honestjs)](https://www.npmjs.com/package/honestjs)\n[![npm](https://img.shields.io/npm/dm/honestjs)](https://www.npmjs.com/package/honestjs)\n[![Bundle Size](https://img.shields.io/bundlephobia/min/honestjs)](https://bundlephobia.com/result?p=honestjs)\n[![Bundle Size](https://img.shields.io/bundlephobia/minzip/honestjs)](https://bundlephobia.com/result?p=honestjs)\n[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/honestjs/honest)](https://github.com/honestjs/honest/pulse)\n[![GitHub last commit](https://img.shields.io/github/last-commit/honestjs/honest)](https://github.com/honestjs/honest/commits/main)\n[![Discord badge](https://img.shields.io/discord/1482150663432442026?label=Discord\u0026logo=Discord)](https://discord.gg/g3TUeXbeq)\n\n\u003c/div\u003e\n\n## Cursor / Agent skills\n\nInstall the Honest skill so your editor agent (e.g. Cursor) can use Honest-specific guidance:\n\n```bash\nbunx skills add https://github.com/honestjs/skills --skill honest\n```\n\nSee [honestjs/skills](https://github.com/honestjs/skills) for details.\n\n\u003e 🚨 **Early Development Warning** 🚨\n\u003e\n\u003e Honest is currently in early development (pre-v1.0.0). Please be aware that:\n\u003e\n\u003e - The API is not stable and may change frequently\n\u003e - Breaking changes can occur between minor versions\n\u003e - Some features might be incomplete or missing\n\u003e - Documentation may not always be up to date\n\u003e\n\u003e We recommend not using it in production until v1.0.0 is released.\n\n\u003e ⚠️ **Documentation is not yet complete** ⚠️\n\u003e\n\u003e If you find any issues or have suggestions for improvements, please open an issue or submit a pull request. See\n\u003e [CONTRIBUTING.md](CONTRIBUTING.md) for how to contribute and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for community\n\u003e guidelines.\n\n## Quick Start\n\n```bash\nbun add -g @honestjs/cli\nhonestjs new my-project   # alias: honest, hnjs\ncd my-project\nbun dev\n```\n\nThis creates a new project with a standard structure and config. Use the [website](https://github.com/honestjs/website)\nfor full docs.\n\n## Features\n\n- **🚀 High performance** — Built on Hono for maximum speed and minimal overhead.\n- **🏗️ Familiar architecture** — Decorator-based API inspired by NestJS; TypeScript-first.\n- **💉 Dependency injection** — Built-in DI container for clean, testable code and automatic wiring.\n- **🔌 Plugin system** — Extend the app with custom plugins, middleware, pipes, and filters. Plugins run in\n  `options.plugins` order; wrapped entries may attach `preProcessors` / `postProcessors` and optional `name` for\n  diagnostics.\n- **🛣️ Advanced routing** — Prefixes, API versioning, and nested route organization.\n- **🛡️ Request pipeline** — Middleware, guards, pipes, and filters at app, controller, or handler level.\n- **🧪 Lightweight testing harness** — Helpers for application, controller, and service-level tests.\n- **🧭 Startup guide mode** — Actionable diagnostics hints for startup failures.\n- **📝 TypeScript-first** — Strong typing and great IDE support out of the box.\n- **🖥️ MVC \u0026 SSR** — Full-stack apps with Hono JSX views; use the `mvc` template or the docs.\n\n### In code\n\n```typescript\nimport 'reflect-metadata'\nimport { Application, Controller, Get, Module, Service } from 'honestjs'\nimport { LoggerMiddleware } from '@honestjs/middleware'\nimport { AuthGuard } from '@honestjs/guards'\nimport { ValidationPipe } from '@honestjs/pipes'\nimport { HttpExceptionFilter } from '@honestjs/filters'\nimport { ApiDocsPlugin } from '@honestjs/api-docs-plugin'\n\n@Service()\nclass AppService {\n\thello(): string {\n\t\treturn 'Hello, Honest!'\n\t}\n}\n\n@Controller()\nclass AppController {\n\tconstructor(private readonly appService: AppService) {}\n\n\t@Get()\n\thello() {\n\t\treturn this.appService.hello()\n\t}\n}\n\n@Module({\n\tcontrollers: [AppController],\n\tservices: [AppService]\n})\nclass AppModule {}\n\nconst { app, hono } = await Application.create(AppModule, {\n\tstartupGuide: { verbose: true },\n\tdebug: {\n\t\troutes: true,\n\t\tplugins: true,\n\t\tpipeline: true,\n\t\tdi: true,\n\t\tstartup: true\n\t},\n\tlogger: myLogger,\n\tstrict: { requireRoutes: true },\n\tdeprecations: { printPreV1Warning: true },\n\tcontainer: myContainer,\n\thono: {\n\t\tstrict: true,\n\t\trouter: customRouter\n\t},\n\trouting: {\n\t\tprefix: 'api',\n\t\tversion: 1\n\t},\n\t// Components: use class (e.g. AuthGuard) or instance (e.g. new LoggerMiddleware()) to pass options\n\tcomponents: {\n\t\tmiddleware: [new LoggerMiddleware()],\n\t\tguards: [AuthGuard],\n\t\tpipes: [ValidationPipe],\n\t\tfilters: [HttpExceptionFilter]\n\t},\n\tplugins: [\n\t\tnew RPCPlugin(),\n\t\tnew ApiDocsPlugin(),\n\t\t{\n\t\t\tplugin: MyPlugin,\n\t\t\tname: 'core',\n\t\t\tpreProcessors: [pre],\n\t\t\tpostProcessors: [post]\n\t\t},\n\t\t{ plugin: MetricsPlugin, name: 'metrics' }\n\t],\n\tonError: (err, c) =\u003e c.json({ error: err.message }, 500),\n\tnotFound: (c) =\u003e c.json({ error: 'Not found' }, 404)\n})\n\nexport default hono\n```\n\nControllers, services, and modules are wired by decorators; use **guards** for auth, **pipes** for validation, and\n**filters** for error handling. See the [documentation](https://github.com/honestjs/website) for details.\n\n## Runtime Metadata Isolation\n\nDecorator metadata is still collected globally, but each application instance now runs on an immutable metadata snapshot\ncaptured during startup. This prevents metadata mutations made after bootstrap from changing behavior in already-running\napplications.\n\n## Plugin order\n\nPlugins run in the order they appear in `options.plugins`. Put producer plugins (for example RPC) before consumers (for\nexample API docs) when one plugin depends on another’s app-context output.\n\n## Testing harness\n\nHonest exports lightweight helpers for common test setups.\n\n```typescript\nimport { createControllerTestApplication, createServiceTestContainer, createTestApplication } from 'honestjs'\n\nconst app = await createTestApplication({\n\tcontrollers: [UsersController],\n\tservices: [UsersService]\n})\n\nconst response = await app.request('/users')\n\nconst controllerApp = await createControllerTestApplication({\n\tcontroller: UsersController\n})\n\nconst services = createServiceTestContainer({\n\tpreload: [UsersService],\n\toverrides: [{ provide: UsersService, useValue: mockUsersService }]\n})\n```\n\n### Running tests in this package\n\nThis repo uses [Bun's test runner](https://bun.sh/docs/cli/test). From the package root:\n\n- `bun test` — run all tests once\n- `bun test --watch` — watch mode\n- `bun test \u003cpattern\u003e` — limit to matching file or test names (for example `bun test application.bootstrap`)\n- `bun run test:coverage` — same suite with coverage (summary in the terminal and `coverage/lcov.info`)\n\nCo-locate tests as `*.test.ts` next to sources. Import `reflect-metadata` first in any file that loads decorated\nclasses, same as in application code.\n\nIntegration-style cases use `*.integration.test.ts` where the whole `Application` stack is exercised (for example the\nrequest pipeline). Shared HTTP fixtures for application tests live under `src/testing/fixtures/` as **factory\nfunctions** so each test gets fresh decorator metadata after `MetadataRegistry.clear()` in `afterEach`.\n\n## Startup diagnostics guide mode\n\nEnable startup guidance to get actionable remediation hints when initialization fails.\n\n```typescript\nawait Application.create(AppModule, {\n\tstartupGuide: true\n})\n\nawait Application.create(AppModule, {\n\tstartupGuide: { verbose: true }\n})\n```\n\nGuide mode emits startup diagnostics hints for common issues such as missing decorators, strict no-routes startup, and\nmetadata issues.\n\n## License\n\nMIT © [Orkhan Karimov](https://github.com/kerimovok)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhonestjs%2Fhonest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhonestjs%2Fhonest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhonestjs%2Fhonest/lists"}