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

Giving away a licence when the schema assumes a payment

Giving away a licence when the schema assumes a payment

Comments
6 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
Four sites, one publisher, and an @id that is not a link

Four sites, one publisher, and an @id that is not a link

Comments
5 min read
Our retry ladder was keyed by the wrong thing

Our retry ladder was keyed by the wrong thing

Comments
5 min read
Most of our diff code exists to not send an alert

Most of our diff code exists to not send an alert

Comments
5 min read
One banner per search, not one per listing

One banner per search, not one per listing

Comments
4 min read
The window reloads every time you open it, so it cannot own the state

The window reloads every time you open it, so it cannot own the state

Comments
4 min read
1,250,964 audit rows recording that nothing happened

1,250,964 audit rows recording that nothing happened

Comments
5 min read
45% of our stored ingredient tags were derivable, so we deleted them

45% of our stored ingredient tags were derivable, so we deleted them

Comments
6 min read
We stopped letting Stripe convert our price, because nobody could quote it

We stopped letting Stripe convert our price, because nobody could quote it

Comments
5 min read
A food log with no server, no sync and no opinion about your data

A food log with no server, no sync and no opinion about your data

Comments
6 min read
Our product search only returns rows the scanner can actually answer for

Our product search only returns rows the scanner can actually answer for

Comments
5 min read
Citric acid is on 14,836 of our products, so the filter has to stay quiet about it

Citric acid is on 14,836 of our products, so the filter has to stay quiet about it

Comments
6 min read
One @id string, deliberately duplicated across four repositories

One @id string, deliberately duplicated across four repositories

Comments
6 min read
We have no marketing state table, only five SQL windows over timestamps we already had

We have no marketing state table, only five SQL windows over timestamps we already had

Comments
6 min read
The affiliate commission was agreed before we knew the buyer's country

The affiliate commission was agreed before we knew the buyer's country

Comments
6 min read
121,570 blocked domains, and none of them reach the browser

121,570 blocked domains, and none of them reach the browser

Comments
5 min read
Five gates in one API wrapper, and the order is the whole design

Five gates in one API wrapper, and the order is the whole design

Comments
6 min read
Only 15 of our 38 employer pages could cite a source, so the type now demands one

Only 15 of our 38 employer pages could cite a source, so the type now demands one

Comments
5 min read
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
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 1
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
loading...