PHPackages                             bjornbasar/karhu - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. bjornbasar/karhu

ActiveLibrary[Framework](/categories/framework)

bjornbasar/karhu
================

Minimal PHP microframework — attribute-routed, zero dependencies, PHP 8.3+

v0.1.3(1w ago)093↑500%1MITPHPPHP &gt;=8.3CI passing

Since Apr 14Pushed 1w agoCompare

[ Source](https://github.com/bjornbasar/karhu)[ Packagist](https://packagist.org/packages/bjornbasar/karhu)[ RSS](/packages/bjornbasar-karhu/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (6)Dependencies (3)Versions (7)Used By (1)

karhu
=====

[](#karhu)

Minimal PHP microframework — attribute-routed, zero runtime dependencies, PHP 8.3+.

[![CI](https://github.com/bjornbasar/karhu/actions/workflows/ci.yml/badge.svg)](https://github.com/bjornbasar/karhu/actions/workflows/ci.yml)

Why karhu?
----------

[](#why-karhu)

A small framework you can read end-to-end. ~1200 LOC core, no closures-as-routes, no YAML, no required dependencies — controllers declare routes via PHP attributes. Extras (DB, queue, view) ship as separate packages.

Install
-------

[](#install)

```
composer create-project bjornbasar/karhu-skeleton myapp
cd myapp
composer serve   # http://localhost:8080
```

Or add karhu to an existing project:

```
composer require bjornbasar/karhu
```

Hello world
-----------

[](#hello-world)

```
use Karhu\Attributes\Route;
use Karhu\Http\Response;

final class HomeController {
    #[Route('GET', '/hello/{name}')]
    public function hello(string $name): Response {
        return Response::json(['hello' => $name]);
    }
}
```

Register the controller in `config/controllers.php` and karhu's attribute scanner wires the route automatically.

What's in the box
-----------------

[](#whats-in-the-box)

CapabilityWhereAttribute routing (`#[Route]`)`src/Http/Router.php` + `src/Attributes/Route.php`Middleware pipeline (PSR-15 shape)`src/Http/MiddlewarePipeline.php`Auto-wiring DI container (PSR-11 shape)`src/Container/Container.php`RBAC + PasswordHasher (argon2id)`src/Auth/`Session, CSRF, CORS, RequireRole middleware`src/Middleware/`Validation attributes (`#[Required]`, `#[StringLength]`, `#[In]`)`src/Http/Validation/`RFC 7807 error responses`src/Error/ExceptionHandler.php`CLI dispatcher (`#[Command]`)`src/Cli/` + `bin/karhu`Logger interface (PSR-3 shape)`src/Log/`Production route cache`bin/karhu route:cache`Companion packages
------------------

[](#companion-packages)

PackagePurpose[karhu-skeleton](https://github.com/bjornbasar/karhu-skeleton)Starter app template[karhu-db](https://github.com/bjornbasar/karhu-db)Thin PDO wrapper + active-record base + `PdoUserRepository`[karhu-queue](https://github.com/bjornbasar/karhu-queue)Queue/worker abstraction, ships with DB driver[karhu-view](https://github.com/bjornbasar/karhu-view)Template engine bridge (Twig + Plates adapters)[istrbuddy](https://github.com/bjornbasar/istrbuddy)Reference issue-tracker app dogfooding the full stackDevelopment
-----------

[](#development)

```
composer install
composer check           # cs-check + phpstan + tests
composer test            # PHPUnit only
composer analyse         # PHPStan level 8
composer cs-fix          # php-cs-fixer (PER-CS2.0)
bin/karhu route:cache    # compile route cache for production
```

PHP 8.3 + 8.4 are tested via the GitHub Actions matrix.

Documentation
-------------

[](#documentation)

- [DOCS.md](DOCS.md) — tech stack, directory layout, design decisions
- [docs/](docs/) — MkDocs Material source (full reference, ADRs)
- [docs/adr/](docs/adr/) — architectural decision records

License
-------

[](#license)

MIT

###  Health Score

43

—

FairBetter than 89% of packages

Maintenance98

Actively maintained with recent releases

Popularity13

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 90.2% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~9 days

Total

6

Last Release

8d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/8a70a357358f560c83c7912fb2c07df4bbf799debcbfbfb0748dcf478d75311e?d=identicon)[bjornbasar](/maintainers/bjornbasar)

---

Top Contributors

[![bjornbasar](https://avatars.githubusercontent.com/u/362911?v=4)](https://github.com/bjornbasar "bjornbasar (37 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (4 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/bjornbasar-karhu/health.svg)

```
[![Health](https://phpackages.com/badges/bjornbasar-karhu/health.svg)](https://phpackages.com/packages/bjornbasar-karhu)
```

###  Alternatives

[laravel/socialite

Laravel wrapper around OAuth 1 &amp; OAuth 2 libraries.

5.7k104.3M822](/packages/laravel-socialite)[laravel/dusk

Laravel Dusk provides simple end-to-end testing and browser automation.

1.9k38.6M289](/packages/laravel-dusk)[pinguo/php-msf

Pinguo Micro Service Framework For PHP

1.7k4.2k](/packages/pinguo-php-msf)[nineinchnick/edatatables

Grid widget for the Yii Framework, wrapper for the DataTables jQuery plugin

173.2k](/packages/nineinchnick-edatatables)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
