This page helps you get from zero to production-ready usage quickly.
Use TOON when you want structured data that is:
decode()If your use case is external API transport, JSON should still be your default.
composer require sbsaga/toon
Laravel package discovery registers provider and facade automatically.
Optional: publish config.
php artisan vendor:publish --provider="Sbsaga\Toon\ToonServiceProvider" --tag=config
Drop this in a route or tinker session:
use Illuminate\Support\Facades\Route;
use Sbsaga\Toon\Facades\Toon;
Route::get('/toon-demo', function () {
$payload = [
'project' => 'TOON',
'users' => [
['id' => 1, 'name' => 'Alice', 'active' => true],
['id' => 2, 'name' => 'Bob', 'active' => false],
],
];
$encoded = Toon::encode($payload);
$decoded = Toon::decode($encoded);
return response()->json([
'toon' => $encoded,
'decoded' => $decoded,
]);
});
Typical encoded output:
project: TOON
users:
items[2]{id,name,active}:
1,Alice,true
2,Bob,false
How to read it:
project: TOON is a simple key/value pairusers: starts a nested blockitems[2]{...} is a table with 2 rows and named columnsuse Sbsaga\Toon\Facades\Toon;
$toon = Toon::encode($payload); // array/json/scalar -> TOON string
$data = Toon::decode($toon); // TOON string -> array
$stats = Toon::estimateTokens($toon); // quick rough token estimate
$diff = Toon::diff($payload); // JSON-vs-TOON size comparison
Global helpers are also available:
$toon = toon_encode($payload);
$data = toon_decode($toon);
$diff = toon_diff($payload);
Default mode is legacy, which keeps old behavior safer for existing users.
// config/toon.php
'compatibility_mode' => 'legacy',
Use modern for new projects or controlled migrations:
// config/toon.php
'compatibility_mode' => 'modern',
Use replacers to remove sensitive fields before TOON encoding.
use Sbsaga\Toon\Facades\Toon;
$safeToon = Toon::encodeWith($payload, function (array $path, string|int|null $key, mixed $value) {
if (in_array($key, ['password', 'token', 'api_key'], true)) {
return Toon::skip();
}
if ($key === 'email') {
return '[redacted]';
}
return $value;
});
Helper version:
$safeToon = toon_encode_with($payload, function (array $path, string|int|null $key, mixed $value) {
return $key === 'debug' ? \Sbsaga\Toon\Toon::skip() : $value;
});
If you want line-based processing:
use Sbsaga\Toon\Facades\Toon;
$lines = Toon::encodeLines($payload); // Generator<string>
$decoded = Toon::decodeFromLines($lines); // array
Helper:
$lines = toon_encode_lines($payload); // array of lines
Basic encode/decode:
php artisan toon:convert storage/app/payload.json --encode
php artisan toon:convert storage/app/payload.toon --decode --pretty
Explicit direction and stats:
php artisan toon:convert storage/app/payload.data --from=json --to=toon --stats
One-off runtime overrides:
php artisan toon:convert storage/app/payload.json --encode --mode=modern --delimiter=pipe
Strict validation for decode:
php artisan toon:convert storage/app/payload.toon --decode --strict
compatibility_mode=legacy for initial upgrade rollout.How can I help you explore Laravel packages today?