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

Our page about a competitor opens by telling you to go and fix their settings

Our page about a competitor opens by telling you to go and fix their settings

2
Comments
7 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
A whole pub is one IP address, and our rate limiter used to take the venue offline

A whole pub is one IP address, and our rate limiter used to take the venue offline

2
Comments
6 min read
We keep two copies of the same DOM helpers, and deduplicating them would break both

We keep two copies of the same DOM helpers, and deduplicating them would break both

2
Comments
7 min read
Our FAQPage node and our FAQ are the same array, and that is the only rule we enforce

Our FAQPage node and our FAQ are the same array, and that is the only rule we enforce

2
Comments
5 min read
69 pages are one TypeScript array, and nothing else on the site is allowed to hold a list

69 pages are one TypeScript array, and nothing else on the site is allowed to hold a list

1
Comments
6 min read
Our checkout retries once, and most of the code is about refusing to retry

Our checkout retries once, and most of the code is about refusing to retry

1
Comments
7 min read
Googlebot is quoted a different price than you are, and our structured data is the reason

Googlebot is quoted a different price than you are, and our structured data is the reason

Comments
5 min read
Our page check returns a score out of four, and the decision does not use it

Our page check returns a score out of four, and the decision does not use it

Comments
6 min read
Our generator ships all 109 results in the HTML, because the generator is not the page

Our generator ships all 109 results in the HTML, because the generator is not the page

Comments
4 min read
Typing the date we recorded into a date input produced the year 60901

Typing the date we recorded into a date input produced the year 60901

Comments
6 min read
Our IndexNow key sits in the repo on purpose, and our own auth gate was the only thing that could break it

Our IndexNow key sits in the repo on purpose, and our own auth gate was the only thing that could break it

Comments
5 min read
Six places a copy rule has to reach, and not one of them is a page

Six places a copy rule has to reach, and not one of them is a page

1
Comments
5 min read
Half our coverage tests assert that the app says nothing

Half our coverage tests assert that the app says nothing

Comments
5 min read
expo-camera has no tap to focus, so we patched it in Kotlin, Swift and the compiled JS

expo-camera has no tap to focus, so we patched it in Kotlin, Swift and the compiled JS

Comments
6 min read
Our food log has no server, so the GDPR export has to say so in a sentence

Our food log has no server, so the GDPR export has to say so in a sentence

Comments
6 min read
Our taxonomy knew 629 E-numbers and could not tell us one was a preservative

Our taxonomy knew 629 E-numbers and could not tell us one was a preservative

Comments
5 min read
We deleted 45% of our stored ingredient tags, and used our own engine as the oracle

We deleted 45% of our stored ingredient tags, and used our own engine as the oracle

Comments
6 min read
max(x) uses the index, max(x) FILTER (where ...) scans the table

max(x) uses the index, max(x) FILTER (where ...) scans the table

Comments
4 min read
Our app writes sentences about your numbers, so we audited every claim it makes

Our app writes sentences about your numbers, so we audited every claim it makes

1
Comments 1
5 min read
Our most valuable tests do not test code, they assert that our content is true

Our most valuable tests do not test code, they assert that our content is true

Comments
5 min read
Our back link was a 20px tap target, and link height was the wrong number to measure

Our back link was a 20px tap target, and link height was the wrong number to measure

Comments
4 min read
We audited every new page at 320px, and the console snippet that should have run first

We audited every new page at 320px, and the console snippet that should have run first

1
Comments
5 min read
Our globals.css beat 514 Tailwind utilities, and CSS cascade layers were the whole story

Our globals.css beat 514 Tailwind utilities, and CSS cascade layers were the whole story

Comments
5 min read
Next's compiler dropped a space in 166 of our sentences, and the source was correct

Next's compiler dropped a space in 166 of our sentences, and the source was correct

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