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

A preference is not a verdict: adding a third lane without letting it argue with the rules engine

A preference is not a verdict: adding a third lane without letting it argue with the rules engine

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
We stopped converting our price at checkout and wrote one figure per currency instead

We stopped converting our price at checkout and wrote one figure per currency instead

Comments
5 min read
Our support desk is a catch-all MX record, and the plus address is the thread

Our support desk is a catch-all MX record, and the plus address is the thread

Comments 1
5 min read
Our reels compute their own verdicts, so a video cannot promise what the app would not say

Our reels compute their own verdicts, so a video cannot promise what the app would not say

Comments
5 min read
Twenty-eight research dossiers before a line of code, and the rule that every claim carries a URL

Twenty-eight research dossiers before a line of code, and the rule that every claim carries a URL

Comments
5 min read
Next.js traces your imports, so the 102 files we read with fs were not deployed

Next.js traces your imports, so the 102 files we read with fs were not deployed

Comments
4 min read
Our preload header downloads four files the page never uses, and one query parameter is why

Our preload header downloads four files the page never uses, and one query parameter is why

Comments 1
4 min read
Nine analytics defaults we turned off, and the one that has to be decided in the browser

Nine analytics defaults we turned off, and the one that has to be decided in the browser

Comments
5 min read
Our PWA plugin never emitted a service worker, and Turbopack is the reason

Our PWA plugin never emitted a service worker, and Turbopack is the reason

Comments
4 min read
Our health endpoint is public, so it answers with a count instead of a name

Our health endpoint is public, so it answers with a count instead of a name

Comments 1
4 min read
Our OG card is a Playwright screenshot, and the Chromium comes from the workspace next door

Our OG card is a Playwright screenshot, and the Chromium comes from the workspace next door

Comments
6 min read
Our deploy CLI default origin is the one origin that can never work

Our deploy CLI default origin is the one origin that can never work

Comments
8 min read
One backoff ladder became four, and the first retry went from ten minutes to sixty seconds

One backoff ladder became four, and the first retry went from ten minutes to sixty seconds

Comments
8 min read
robots.txt cannot protect a URL somebody forwards, and that is the whole reason for the meta tag

robots.txt cannot protect a URL somebody forwards, and that is the whole reason for the meta tag

Comments
4 min read
Our free-licence script reuses your token, because the token is not ours to regenerate

Our free-licence script reuses your token, because the token is not ours to regenerate

Comments
7 min read
Three search rankers in one app, sharing one function and nothing else

Three search rankers in one app, sharing one function and nothing else

Comments
5 min read
Four sites, one publisher node, and an @id that deliberately is not a link

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

Comments
6 min read
Five things happen before our API route runs, and the order is the design

Five things happen before our API route runs, and the order is the design

Comments
4 min read
Four rendering modes in one Next.js app, and the root dynamic segment that answered every typo

Four rendering modes in one Next.js app, and the root dynamic segment that answered every typo

Comments
6 min read
A personalisation hint in the root layout pulled 100KB of catalogue into every page

A personalisation hint in the root layout pulled 100KB of catalogue into every page

Comments
4 min read
The blanket reduced-motion rule has a hole in it, and scroll-driven CSS is what falls through

The blanket reduced-motion rule has a hole in it, and scroll-driven CSS is what falls through

Comments
5 min read
Our nightly deletion job failed silently on every run, and the bug was a Date object

Our nightly deletion job failed silently on every run, and the bug was a Date object

Comments
4 min read
Intl says zero decimals, Stripe wants hundredths, and the shelf wants ¥2,300

Intl says zero decimals, Stripe wants hundredths, and the shelf wants ¥2,300

Comments
5 min read
Our picker splits at nine items, and four separate rules decide when a row may move

Our picker splits at nine items, and four separate rules decide when a row may move

Comments 1
6 min read
Sequential does not mean slow enough: our email loop ran at 13 sends a second

Sequential does not mean slow enough: our email loop ran at 13 sends a second

Comments
5 min read
The same 38 recipes are a catalogue on our website and a silent filter in our app

The same 38 recipes are a catalogue on our website and a silent filter in our app

Comments
6 min read
373 static pages that answer by running the scanner, and the filler ingredient that answered instead

373 static pages that answer by running the scanner, and the filler ingredient that answered instead

Comments
6 min read
node --test runs our TypeScript, and the price is that @/ does not exist

node --test runs our TypeScript, and the price is that @/ does not exist

Comments
6 min read
Two quota alerts on the same 0.5 GB database, and the second one was not the table I expected

Two quota alerts on the same 0.5 GB database, and the second one was not the table I expected

Comments
6 min read
Three facts hide our splash screen, and the two that would have been wrong to wait for

Three facts hide our splash screen, and the two that would have been wrong to wait for

Comments
5 min read
Six percent of the box, with an eight point floor: padding a crop the user drew with a finger

Six percent of the box, with an eight point floor: padding a crop the user drew with a finger

Comments
7 min read
Six files, one write pattern, and six different answers to "what if this is garbage?"

Six files, one write pattern, and six different answers to "what if this is garbage?"

Comments
6 min read
parseInt returned NaN, and splice(NaN, 1) deleted the first search

parseInt returned NaN, and splice(NaN, 1) deleted the first search

Comments
6 min read
Our Electron app has no test framework, and the only rule is that testable files may not import electron

Our Electron app has no test framework, and the only rule is that testable files may not import electron

Comments
6 min read
If we show the user a countdown, we have to let them skip it

If we show the user a countdown, we have to let them skip it

Comments
6 min read
No session, no reply: one rule enforced at the write, the run and the teardown

No session, no reply: one rule enforced at the write, the run and the teardown

Comments
6 min read
Five rooms in one search is one banner, not five

Five rooms in one search is one banner, not five

Comments
5 min read
Storage written by an older build of your app is untrusted input, and 'absent' is the trap

Storage written by an older build of your app is untrusted input, and 'absent' is the trap

Comments
6 min read
Alert.alert is an empty function on the web, so every confirm button in our app did nothing

Alert.alert is an empty function on the web, so every confirm button in our app did nothing

Comments
5 min read
A search hit we cannot answer is worse than no hit, so our index covers a tenth of the table

A search hit we cannot answer is worse than no hit, so our index covers a tenth of the table

Comments
5 min read
Our rank checker prints the URL, which is how we found out we rank with the wrong page

Our rank checker prints the URL, which is how we found out we rank with the wrong page

Comments
5 min read
We un-hid our hidden SEO text on 24 pages, then found it again with one line of console

We un-hid our hidden SEO text on 24 pages, then found it again with one line of console

Comments 1
5 min read
3,281 unit tests in 4.4 seconds, and the DATABASE_URL points at port 1

3,281 unit tests in 4.4 seconds, and the DATABASE_URL points at port 1

Comments
5 min read
The heaviest thing on our report page is a 469KB chunk that arrives 30 seconds late

The heaviest thing on our report page is a 469KB chunk that arrives 30 seconds late

Comments
5 min read
Premium does not unlock the games, and the access check never looks at your tier

Premium does not unlock the games, and the access check never looks at your tier

Comments
5 min read
One code box, four programmes, and the difference between "not mine" and "no"

One code box, four programmes, and the difference between "not mine" and "no"

Comments
5 min read
Electron says 'unspecified', Playwright wants 'Lax', and the session cookies vanished

Electron says 'unspecified', Playwright wants 'Lax', and the session cookies vanished

Comments
5 min read
A 429 is not a no: the three answers our licence check has to tell apart

A 429 is not a no: the three answers our licence check has to tell apart

Comments
4 min read
Our 15 search limit is a latency budget, not a pricing tier

Our 15 search limit is a latency budget, not a pricing tier

Comments
4 min read
The consent checkbox we tick for you, and the one we never will

The consent checkbox we tick for you, and the one we never will

Comments 1
5 min read
€1450 per month is rent, €9.99 per month is a paywall, and one digit tells them apart

€1450 per month is rent, €9.99 per month is a paywall, and one digit tells them apart

Comments
5 min read
21 reply statuses, and the 8 that mean never touch this listing again

21 reply statuses, and the 8 that mean never touch this listing again

Comments
5 min read
Prices round up, discounts round down, and one package decides both

Prices round up, discounts round down, and one package decides both

Comments 1
6 min read
Rewriting a million rows when the only acceptable diff is zero bytes

Rewriting a million rows when the only acceptable diff is zero bytes

Comments
6 min read
135,692 label words in 49 languages, and not one model call in the path

135,692 label words in 49 languages, and not one model call in the path

Comments
6 min read
An ingredient nobody has looked at yet is not an ingredient that is fine

An ingredient nobody has looked at yet is not an ingredient that is fine

Comments
6 min read
Our web app is the phone app: 103 files, 14 web branches, one .web.tsx

Our web app is the phone app: 103 files, 14 web branches, one .web.tsx

Comments
5 min read
Zero img tags on our landing page, and four of the phones on it are app screens

Zero img tags on our landing page, and four of the phones on it are app screens

Comments
4 min read
A nightly Postgres backup for $0, and the four things that break it

A nightly Postgres backup for $0, and the four things that break it

Comments
4 min read
A two-column desktop layout that has to be byte-identical on mobile

A two-column desktop layout that has to be byte-identical on mobile

Comments
4 min read
loading...