aiku existed inside Aurora before aiku existed
Naming a system is supposed to be a decision. A meeting, a shortlist, someone checking domains. aiku never got that. Its name was already three years old the day the project adopted it — and the project itself had spent its first eight months under a different name entirely. Both names are still in the git history, timestamped, for anyone to check.
October 2020: the name, before the thing
The file that started it carries its own birth certificate, in the usual style:
// trait.Aiku.php
Author: Raul A Perusquía-Flores (raul@aiku.io)
Created: Fri, 16 Oct 2020 15:03:29 Malaysia Time, Kuala Lumpur, Malaysia
Copyright (c) 2020. Aiku.io
The Laravel application that today runs the warehouses, the storefronts and this blog did not exist. But the domain did, the email did, and the trait did. It was mixed into class.DB_Table.php — the base class of Aurora's hand-rolled ORM, the one every customer, order and invoice extends:
include_once 'trait.Aiku.php';
abstract class DB_Table extends stdClass
{
use Aiku;
The hook wasn't added to some entities; it was added to the concept of an entity. The first version was modest: for a handful of dimensions — staff, users, stores, customers — it pushed the change over HTTP to whatever was listening on the other end, authenticated with a constant named, hopefully, AIKU_TOKEN. What was listening, in 2020, was barely more than the token's name. The commit message from that day says, with no ceremony at all: "trains in aikus".
August 2022: Pika
The body the name would eventually inhabit started somewhere else. On a visit to one of our warehouses in Eastern Europe, watching the picking floor, I started an experiment: extract just the picking out of Aurora into a micro-service. Small scope on purpose. I prototyped it on Lumen, Laravel's micro-framework, and seriously considered Slim.
The framework choice was the whole point. After fourteen years of hand-rolling everything — router, ORM, templates, job runner — the risk wasn't that my stack was bad. It was that it was mine alone. Nobody on earth could be hired who already knew it. Going mainstream wasn't a technical upgrade; it was insurance that someone else could ever help.
The experiment got a name: Pika. And it refused to stay small. The repository that today holds aiku opens on 9 August 2022 with the commit "initial laravel app", and the tickets that follow tell you what it was called: PIKA-2 Marketing external homepage, PIKA-3 Register/Login, PIKA-5 App layout. On the Aurora side, the same months fill with pika api, fetch pika part, pika deleted delivery note — the old system learning to talk to the picking experiment that was quietly becoming a platform.
March 2023: the rename that wasn't a decision
By early 2023 Pika wasn't a picking micro-service. It was a Laravel application growing fetchers, layouts, auth — the beginnings of everything. The name that fit had been sitting in Aurora's base class since 2020. The switch is one ticket:
2023-03-24 PKA-170 Change project name from pika to aiku
2023-03-24 PKA-174 Logo: Pika -> Aiku
No announcement, no meeting. The experiment grew into the name that had been waiting for it. (Project codenames are a tradition here — the 2008 system's tickets said KAKTUS, the picking experiment said PIKA; the products just eventually catch up.)
April 2025: the stack
The HTTP push of 2020 was fine for four entity types. The full migration needed something sturdier, and in April 2025 the trait got its final form — "fetch aurora by stack". Every change now lands in a table literally named Stack Aiku Dimension:
insert into `Stack Aiku Dimension`
(`Stack Aiku Creation Date`, `Stack Aiku Last Update Date`,
`Stack Aiku Operation`, `Stack Aiku Operation Key`)
values (?,?,?,?)
ON DUPLICATE KEY UPDATE
`Stack Aiku Last Update Date` = ?,
`Stack Aiku Counter` = `Stack Aiku Counter` + 1
Not an event bus, not a message broker — a stack, in a MySQL table, with spaces in the column names because that's how Aurora's schema had always been. Debounced by the ON DUPLICATE KEY clause: a product saved fifty times in an hour is one row with a counter at fifty, not fifty jobs. Eighteen trait.*Aiku.php files — CustomerAiku, OrderAiku, DeliveryNoteAiku, InvoiceAiku, down to TimesheetAiku — teach each domain class what to announce. Read together they're a census of everything the old system considered real, and a to-do list for everything the new one had to hold.
The arrows reverse
The best part is recent. For twenty years, data was born in Aurora and flowed outward. Then, in October 2025, commits like "create prospect from aiku" appear in Aurora's log — and with them files like api_aiku_create_customer.php, which does something the 2020 trait could never have imagined: it receives a customer created in aiku, stores the new system's id in a column called from_aiku_id, and keeps Aurora's copy in sync.
The old system, which spent five years announcing its changes to the new one, now takes dictation from it. Aurora is still running — it gets patched to serve aiku's needs to this day — but the direction of truth has flipped, one entity at a time, exactly the way it began: quietly, from the basement, under a name that arrived before the thing it named.