Tatang Haryadi
Chief Technology Officer
I fix technology programmes that are already late, then build the products and the teams that come after. A USD 3 million transformation delivered in nine months, after three years of not delivering. Social commerce scaled to 1.5 million monthly users across three markets. A global technology team of up to 50. I still read the diffs.
Ask
Ask a question about my work and get the passages that answer it, ranked. Nothing you type leaves this tab, because there is no server to send it to. How it works, and what it deliberately is not, is in the colophon.
The passages are already indexed. What loads is the sentence-transformer that reads your question, not this site.
A one-time download of about 20 MB, cached by your browser afterwards: 16 MB of model weights and 3 MB of WebAssembly runtime.
Or try one of these:
Or read the portfolio straight through, without loading anything.
Work
Four projects. Each title opens the detail in place, including what it cost and what it returned. With no JavaScript the same title is an ordinary link into the portfolio page, which is where that detail is written and where every fragment below is generated from. Nothing on this page restates a figure that lives there, because two copies of a number is one copy too many.
-
Product Management
Restaurant Technology Platform
Point-of-sale, kitchen display and loyalty; an ESP32 and EMQX sensor layer running inference on the device; menu planning by retrieval over real product mix data.
-
Technology Strategy Optimization
Ghost Kitchen Startup
A cost-structure problem before an engineering one: AWS to GCP, repurchasing ERP rather than carrying it across, GitHub Actions and Terraform and Go, and building capability in-house instead of buying it.
-
Digital Transformation
Multinational Retail Company
A rescue that turned on scope rather than delivery speed: new WMS, legacy ERP kept for financials, omnichannel across e-commerce and point-of-sale and loyalty, then harmonising systems across three more markets.
-
Applied AI
Browser-Local Semantic Search
The search at the top of this page. Built end to end rather than specified: a quantised transformer under WebAssembly, every byte served from this origin, and an exhaustive scan because the approximate index would be slower.
Colophon
What this page is made of and what a machine checks on every commit. The long version of all of it is in the repository, which is the point of writing it down.
- Model
- all-MiniLM-L6-v2, quantised to 8-bit ONNX
- Runtime
- ONNX Runtime Web on WebAssembly, one thread
- Embedding
- 384 dimensions, L2-normalised, precomputed
- Retrieval
- Exhaustive cosine, no approximate index
- Transfer
- 20.0 MB over the wire, 37.3 MB on disk, gzip
- Inference servers
- None. There is no backend to this site
- First-party JavaScript
- One module,
js/ask.js. No bundler, no package manager - Build step
- None. GitHub Pages serves the repository as written
How the search works, and what it deliberately is not
The library is Transformers.js. It, the runtime, the tokenizer and the weights are all served from this domain, which is what lets the claim above be literal rather than approximate: your question is tokenised, embedded and compared in this tab, and no network request carries it. One script here does come from a CDN, htmx, pinned to a version and a Subresource Integrity digest so the host cannot change what runs. It takes no part in answering.
It retrieves; it does not generate. What comes back is a passage I actually wrote, scored and linked to where it sits on the portfolio page. No language model writes prose about me here, so there is nothing that can invent a credential. The honest limitation: it answers "what did he do with IoT" well and "would he suit a fintech CTO role" badly, because the second is asking for a judgement and this only knows how to find the nearest paragraph.
What a machine checks, so you do not have to trust me
The interesting claim on a page like this is never the design, it is whether anything stops the design from quietly going wrong. Six checks run on every pull request, each catching a failure that is invisible on a page that loads cleanly.
- The palette, written out in four files, cannot drift from the stylesheet that is its source of truth. Text contrast is held at 4.5:1 against the tighter of the two colour schemes.
- The navigation, written out three times so the site works with no JavaScript and a crawler sees the links as content, cannot disagree with itself.
- Every passage in the search index must still exist on the page it was generated from. Editing prose without regenerating the index retrieves worse and raises no error.
- Every project detail in the index above must be exactly what the generator emits from the portfolio page, so the two cannot say different things.
- Every fragment an interaction fetches must resolve, and every control that fetches one must keep its identifier. A missing fragment is a silent no-op on click, and a control that loses its identifier mid-swap strands keyboard focus.
- The design tokens must still parse as design tokens, and a warning fails the build rather than only an error, because a warning means the file has started describing something no longer on the page.
Checks like these are not the only place this repository does real work rather than a demo of one. Grain hides a file inside a picture — real AES-256-GCM encryption behind a passphrase, not an obfuscation — entirely in your browser, with nothing uploaded.
On how this was built
A frontier model wrote most of the code here, and saying so is not the interesting part: in 2026 that is true of most pages, and a model asked for a personal site will hand back the same centred hero and the same carousel every time. This page had one of each until recently. The difference is not what the model can produce, it is what it is asked to hold itself to. Judge the repository, not the hero.