DEV Community

Daniel Pertu profile picture

Daniel Pertu

404 bio not found

Location London Joined Joined on  Personal website https://cogniprep.app

Work

Founder of CogniPrep

Four PDF reports, one download helper, and a race I deliberately did not fix

Four PDF reports, one download helper, and a race I deliberately did not fix

Comments
5 min read

Want to connect with Daniel Pertu?

Create an account to connect with Daniel Pertu. You can also sign in below to proceed if you already have an account.

Already have an account? Sign in
Three search rankers in one codebase, and none of them should be shared

Three search rankers in one codebase, and none of them should be shared

Comments
5 min read
A question is not always the unit: four content shapes in one JSON library

A question is not always the unit: four content shapes in one JSON library

Comments
4 min read
'2026-27' is a better database key than a date range

'2026-27' is a better database key than a date range

Comments
4 min read
percentile_cont, a 20,000 row window, and the difference between skipped and failed

percentile_cont, a 20,000 row window, and the difference between skipped and failed

Comments
4 min read
Gmail deletes your SVG logo and Outlook ignores your flexbox

Gmail deletes your SVG logo and Outlook ignores your flexbox

1
Comments
4 min read
Partial credit for chained arithmetic, and the 120-line parser that does it

Partial credit for chained arithmetic, and the 120-line parser that does it

Comments
4 min read
38 clamps, four probits, and one coefficient rounded to 15 digits

38 clamps, four probits, and one coefficient rounded to 15 digits

1
Comments
5 min read
A missing 'use client' shipped 165 games to play one of them

A missing 'use client' shipped 165 games to play one of them

2
Comments
4 min read
Replaying a practice test should not deal the same paper

Replaying a practice test should not deal the same paper

Comments
4 min read
We shipped guest play at 17:39 and deleted it at 18:35

We shipped guest play at 17:39 and deleted it at 18:35

Comments
5 min read
Seven steps to charge one credit, and why none of them can be reordered

Seven steps to charge one credit, and why none of them can be reordered

Comments
5 min read
A list nothing derives from will drift, and ours did it twice

A list nothing derives from will drift, and ours did it twice

Comments 1
5 min read
Our entitlements are five independent axes, not a plan ladder

Our entitlements are five independent axes, not a plan ladder

Comments
5 min read
We asked for a review the moment someone paid, which is the worst moment

We asked for a review the moment someone paid, which is the worst moment

Comments
5 min read
A CSS triangle vanished, because one selector matched by substring

A CSS triangle vanished, because one selector matched by substring

Comments 1
5 min read
Our scoring pipeline had one output, and for 31 tests it was the wrong one

Our scoring pipeline had one output, and for 31 tests it was the wrong one

Comments
5 min read
If you generate the puzzle randomly, you have to solve it too

If you generate the puzzle randomly, you have to solve it too

Comments
6 min read
Our prices are a function of the content, so the content is not allowed to lie

Our prices are a function of the content, so the content is not allowed to lie

Comments
4 min read
for...in turned my nested arrays into objects, and the candidate scored zero

for...in turned my nested arrays into objects, and the candidate scored zero

Comments
4 min read
A sequential send loop hit a 10 per second rate limit, because it was fast

A sequential send loop hit a 10 per second rate limit, because it was fast

Comments
5 min read
Eleven branches, one shared file: the anchor rule that made them merge

Eleven branches, one shared file: the anchor rule that made them merge

Comments
5 min read
The answer options were below the fold, on a 1440px screen

The answer options were below the fold, on a 1440px screen

Comments
5 min read
Every answer key in our product was on the CDN, with an immutable header

Every answer key in our product was on the CDN, with an immutable header

Comments
5 min read
Our design tokens are a package, and the marketing site is deliberately not a consumer

Our design tokens are a package, and the marketing site is deliberately not a consumer

Comments 1
4 min read
A nightly pg_dump that fails with the reason, not with "Network is unreachable"

A nightly pg_dump that fails with the reason, not with "Network is unreachable"

Comments
4 min read
Three capture screens in ninety minutes: what we deleted to make label photos readable

Three capture screens in ninety minutes: what we deleted to make label photos readable

Comments
5 min read
We upgraded our job platform at 10:22 and deleted it at 13:34

We upgraded our job platform at 10:22 and deleted it at 13:34

Comments
5 min read
120 milliseconds is not a delay, it is proof of a second frame

120 milliseconds is not a delay, it is proof of a second frame

Comments
5 min read
One human agreement counts the same as one matching machine read

One human agreement counts the same as one matching machine read

Comments
4 min read
Green ticks for three hours: the lock whose TTL was the job's worst case

Green ticks for three hours: the lock whose TTL was the job's worst case

Comments
4 min read
Five sequential awaits before a cache hit could leave the building

Five sequential awaits before a cache hit could leave the building

Comments
4 min read
Why our 404 page exists: the default one painted the header the wrong colour

Why our 404 page exists: the default one painted the header the wrong colour

Comments
3 min read
The session rides in the URL fragment: handing a login from the marketing site to the app

The session rides in the URL fragment: handing a login from the marketing site to the app

Comments
4 min read
Reply-To is the foreign key: threading support email onto tickets with plus addressing

Reply-To is the foreign key: threading support email onto tickets with plus addressing

Comments
5 min read
Our house style is a 63-line unit test, and the first thing it caught was an email

Our house style is a 63-line unit test, and the first thing it caught was an email

Comments
4 min read
Fifty nine characters: the test that reads the title of every generated page

Fifty nine characters: the test that reads the title of every generated page

Comments
4 min read
450 label words the test suite will not let us ship without

450 label words the test suite will not let us ship without

Comments
4 min read
A type with no word for "absent": an allergen layer that can only push down

A type with no word for "absent": an allergen layer that can only push down

Comments
4 min read
The number the label does not print: reading fat off an ingredients list

The number the label does not print: reading fat off an ingredients list

Comments
5 min read
A recipe is a scan with no camera: one rules engine, three surfaces

A recipe is a scan with no camera: one rules engine, three surfaces

Comments
5 min read
Consent is a version number, and the layout was writing it during render

Consent is a version number, and the layout was writing it during render

Comments
5 min read
Write the ledger row first: the ordering that makes a credit balance auditable

Write the ledger row first: the ordering that makes a credit balance auditable

Comments
5 min read
First touch wins: a personalisation hint that is allowed to be wrong

First touch wins: a personalisation hint that is allowed to be wrong

Comments
5 min read
Twenty four strings got their own file, because one import cost every page 100 KB

Twenty four strings got their own file, because one import cost every page 100 KB

Comments
5 min read
Chrome's MediaRecorder does not tell you how long the video is

Chrome's MediaRecorder does not tell you how long the video is

Comments
5 min read
One constant slows down every ad we render, and some clips are exempt

One constant slows down every ad we render, and some clips are exempt

1
Comments
5 min read
Deleting 50,000 rows inside a 60 second serverless function

Deleting 50,000 rows inside a 60 second serverless function

Comments
5 min read
The fingerprint we deliberately do not use to catch referral fraud

The fingerprint we deliberately do not use to catch referral fraud

Comments
5 min read
Our concurrent login cap asked a question that was always true

Our concurrent login cap asked a question that was always true

Comments
5 min read
What should your app do when Redis is not there?

What should your app do when Redis is not there?

Comments
5 min read
Every constant in this file is a promise to a player

Every constant in this file is a promise to a player

Comments
5 min read
Deploying in the middle of a question: graceful shutdown for a WebSocket game server

Deploying in the middle of a question: graceful shutdown for a WebSocket game server

Comments
4 min read
Ten rate limiters, and the only hard question was what to key each one on

Ten rate limiters, and the only hard question was what to key each one on

Comments
4 min read
null meant unlimited, so our free trial outranked the paid plan

null meant unlimited, so our free trial outranked the paid plan

Comments
4 min read
Print is a feature: laying out A4 QR sheets in the browser with jsPDF

Print is a feature: laying out A4 QR sheets in the browser with jsPDF

1
Comments
4 min read
The reconnect backoff that punished you for reconnecting

The reconnect backoff that punished you for reconnecting

Comments 1
4 min read
The join flow is a URL: designing for a hundred strangers who will not install anything

The join flow is a URL: designing for a hundred strangers who will not install anything

Comments
5 min read
Our link preview cards are drawn by code, from the same three files as the site

Our link preview cards are drawn by code, from the same three files as the site

Comments
4 min read
The arithmetic IS the product: building a planner that tells people the truth

The arithmetic IS the product: building a planner that tells people the truth

Comments
4 min read
loading...