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 rate limiter lets you through when it breaks, and it never learns your email address

Our rate limiter lets you through when it breaks, and it never learns your email address

Comments 1
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
Googlebot sees our prices in pounds and you probably do not, and the figure on the page is always the figure charged

Googlebot sees our prices in pounds and you probably do not, and the figure on the page is always the figure charged

1
Comments 1
6 min read
Typing "pubs" into our business search puts Public safety service first, and the fix was not better matching

Typing "pubs" into our business search puts Public safety service first, and the fix was not better matching

Comments
6 min read
Our free plan hides creators with a window function, and the locked count is the same predicate with a "not" in front

Our free plan hides creators with a window function, and the locked count is the same predicate with a "not" in front

Comments 1
5 min read
Our content pages are written in two inline markup tokens, and one test follows all 342 internal links

Our content pages are written in two inline markup tokens, and one test follows all 342 internal links

Comments
5 min read
A prefetch of our pricing page is a different URL, and our auth check nearly sent it to the login page

A prefetch of our pricing page is a different URL, and our auth check nearly sent it to the login page

1
Comments 1
5 min read
Twelve tables, 21 foreign keys, and not one ON DELETE CASCADE, so "delete my history" is four statements in a fixed order

Twelve tables, 21 foreign keys, and not one ON DELETE CASCADE, so "delete my history" is four statements in a fixed order

Comments 1
5 min read
Railway builds our WebSocket server from its own directory, so it cannot see the workspace it belongs to

Railway builds our WebSocket server from its own directory, so it cannot see the workspace it belongs to

Comments
5 min read
Our two halves deploy to two platforms, so every single field in the message between them is optional

Our two halves deploy to two platforms, so every single field in the message between them is optional

Comments
5 min read
Two phones at the same table pressed Join in the same moment, and the loser was told the quiz did not exist

Two phones at the same table pressed Join in the same moment, and the loser was told the quiz did not exist

Comments
6 min read
Every table in our database is inserted with the word "placeholder" in a NOT NULL column, because the QR code contains the row's own id

Every table in our database is inserted with the word "placeholder" in a NOT NULL column, because the QR code contains the row's own id

Comments
6 min read
Our maintenance switch is a boolean in the repository, because the database is the thing that is down

Our maintenance switch is a boolean in the repository, because the database is the thing that is down

Comments
6 min read
Our comparison pages have a required field for where the competitor wins, and 13 of 49 rows say it is them

Our comparison pages have a required field for where the competitor wins, and 13 of 49 rows say it is them

Comments
6 min read
Our two checkout routes refuse four things before Stripe is involved, and the order is by cost

Our two checkout routes refuse four things before Stripe is involved, and the order is by cost

Comments
6 min read
Two processes count the same three numbers, and the renderer's shortcut turns rightmove.co.uk into co.uk

Two processes count the same three numbers, and the renderer's shortcut turns rightmove.co.uk into co.uk

Comments
6 min read
Our price is a component six times and a hardcoded string fifty-two times, and one sentence decides which

Our price is a component six times and a hardcoded string fifty-two times, and one sentence decides which

Comments
6 min read
Our header is 48 pixels tall, every page offsets by 56, and the root layout renders no header at all

Our header is 48 pixels tall, every page offsets by 56, and the root layout renders no header at all

Comments
6 min read
Our inbound mail webhook answers 200 to everything it refuses, and 500 to the one thing it cannot do

Our inbound mail webhook answers 200 to everything it refuses, and 500 to the one thing it cannot do

Comments
7 min read
40 font-face blocks, 10 files, and the word bold appears nowhere: three typefaces reaching a Next.js site and an Expo app

40 font-face blocks, 10 files, and the word bold appears nowhere: three typefaces reaching a Next.js site and an Expo app

Comments
5 min read
A purchase intent has to survive a round trip through Google, so ours rides in a query parameter that deletes itself on arrival

A purchase intent has to survive a round trip through Google, so ours rides in a query parameter that deletes itself on arrival

Comments
5 min read
A 3% zoom hid a one-pixel rounding gap for 372 cards, then cut the first letters off the 373rd

A 3% zoom hid a one-pixel rounding gap for 372 cards, then cut the first letters off the 373rd

Comments
6 min read
Four files in our monorepo print the same legally required sentence, and three of them disagree about its wording

Four files in our monorepo print the same legally required sentence, and three of them disagree about its wording

Comments
5 min read
"4200subscribers": the content said "black" and the renderer believed it

"4200subscribers": the content said "black" and the renderer believed it

Comments
4 min read
Our favicon is 1,322 bytes, our touch icon is rasterised from it at build time, and we serve no favicon.ico at all

Our favicon is 1,322 bytes, our touch icon is rasterised from it at build time, and we serve no favicon.ico at all

Comments
5 min read
A loading skeleton is a second implementation of your layout, and mine was lying about four things

A loading skeleton is a second implementation of your layout, and mine was lying about four things

Comments
6 min read
Our viewfinder has no shutter button, and the four rectangles dimming the rest of the frame are not a hole in an overlay

Our viewfinder has no shutter button, and the four rectangles dimming the rest of the frame are not a hole in an overlay

Comments
5 min read
Reanimated's layout animations left a verdict word painted over the badge beneath it, so our app animates maxHeight to 100000 instead

Reanimated's layout animations left a verdict word painted over the badge beneath it, so our app animates maxHeight to 100000 instead

Comments
5 min read
A user replied "thank you very much" and we received our own email back underneath it

A user replied "thank you very much" and we received our own email back underneath it

Comments
6 min read
One preference, eight surfaces: where a UK/US spelling toggle actually has to reach

One preference, eight surfaces: where a UK/US spelling toggle actually has to reach

Comments
6 min read
172 stems and 105 one-off words: converting our content to American spelling without a blanket rule

172 stems and 105 one-off words: converting our content to American spelling without a blanket rule

Comments
5 min read
The word influencer is allowed in nine fields and banned in the body, and one test knows which is which

The word influencer is allowed in nine fields and banned in the body, and one test knows which is which

1
Comments
6 min read
Stripe is the seller of record in 27 countries and nowhere else, and one rejected field must never block a sale

Stripe is the seller of record in 27 countries and nowhere else, and one rejected field must never block a sale

Comments
5 min read
866 lines of CSS, not one hex code, and every single value declared twice

866 lines of CSS, not one hex code, and every single value declared twice

Comments
6 min read
Our admin panel answers 404 to every signed-in account that is not on a hardcoded list

Our admin panel answers 404 to every signed-in account that is not on a hardcoded list

Comments
4 min read
Our structured data is two script tags, and the rule is that no node may claim more than the page shows

Our structured data is two script tags, and the rule is that no node may claim more than the page shows

Comments
4 min read
Two paths announce our pages to Bing, and one Redis hash keeps them from announcing twice

Two paths announce our pages to Bing, and one Redis hash keeps them from announcing twice

Comments
5 min read
167 tests across twelve files, and 80 of them are about money

167 tests across twelve files, and 80 of them are about money

Comments 1
5 min read
I published our build command at 10:19 and deleted half of it at 13:20

I published our build command at 10:19 and deleted half of it at 13:20

Comments
4 min read
Every page of our marketing site ships a notification system, and the marketing site never notifies anybody

Every page of our marketing site ships a notification system, and the marketing site never notifies anybody

Comments
4 min read
25 toast call sites, one message slot, and a tab that is forbidden to unmount

25 toast call sites, one message slot, and a tab that is forbidden to unmount

Comments
6 min read
Fifteen chart colours and no charts, and a theme class that repeats :root line for line

Fifteen chart colours and no charts, and a theme class that repeats :root line for line

Comments
5 min read
One page on our site unmounts its FAQ answers, the other twenty-nine keep them in the DOM, and only one of those choices was deliberate

One page on our site unmounts its FAQ answers, the other twenty-nine keep them in the DOM, and only one of those choices was deliberate

Comments
6 min read
A stranger cannot reach our 404 page, and three of our four error screens report to nobody

A stranger cannot reach our 404 page, and three of our four error screens report to nobody

Comments
5 min read
Our content plan said 63 pages, its own tables said 65, and the live sitemap agrees with the tables

Our content plan said 63 pages, its own tables said 65, and the live sitemap agrees with the tables

Comments
5 min read
A failed payment still gets Premium, and the column that stops a retried Stripe event from undoing a cancellation

A failed payment still gets Premium, and the column that stops a retried Stripe event from undoing a cancellation

Comments 1
5 min read
Three Sentry inits of four lines each on the website, and deliberately none in the desktop app

Three Sentry inits of four lines each on the website, and deliberately none in the desktop app

Comments
5 min read
The permission dialog is product copy, and app.json is where a privacy promise becomes enforceable

The permission dialog is product copy, and app.json is where a privacy promise becomes enforceable

1
Comments 2
5 min read
Our maintenance switch is 14 lines, and the interesting part is the three API routes it refuses to turn off

Our maintenance switch is 14 lines, and the interesting part is the three API routes it refuses to turn off

Comments
6 min read
Next.js merges metadata from the root down, and three of the fields must never be inherited

Next.js merges metadata from the root down, and three of the fields must never be inherited

Comments
5 min read
Googlebot is quoted £20, a visitor in Amsterdam is quoted €24.99, and the regex that decides is twelve words long

Googlebot is quoted £20, a visitor in Amsterdam is quoted €24.99, and the regex that decides is twelve words long

Comments
6 min read
We deleted our finished videos and shipped the layers instead: rendering transparent overlays with Remotion

We deleted our finished videos and shipped the layers instead: rendering transparent overlays with Remotion

Comments
5 min read
Our contact form has no captcha, and the four things standing in its place

Our contact form has no captcha, and the four things standing in its place

Comments
6 min read
Forwarding your support email turns off Gmail's spam filter, so we had to put one back

Forwarding your support email turns off Gmail's spam filter, so we had to put one back

Comments
5 min read
One boolean, three different answers: the maintenance switch for an app that is half marketing site

One boolean, three different answers: the maintenance switch for an app that is half marketing site

Comments 1
4 min read
Screenshotting every screen in the app found four bugs that no test was ever going to catch

Screenshotting every screen in the app found four bugs that no test was ever going to catch

Comments 1
5 min read
Two numbers moved in opposite directions and the copy on four surfaces updated itself

Two numbers moved in opposite directions and the copy on four surfaces updated itself

Comments
5 min read
Two ordered regex tables instead of a user-agent library, because the label only has to survive a support call

Two ordered regex tables instead of a user-agent library, because the label only has to survive a support call

Comments
4 min read
Four email campaigns that anchored on activity now anchor on signup, and the correlated subqueries went with them

Four email campaigns that anchored on activity now anchor on signup, and the correlated subqueries went with them

Comments
4 min read
372 games, 372 card screenshots, and a manifest the build generates so a card cannot point at a missing file

372 games, 372 card screenshots, and a manifest the build generates so a card cannot point at a missing file

Comments
5 min read
One boolean takes the app down, and the hard part was deciding which pages stay up

One boolean takes the app down, and the hard part was deciding which pages stay up

Comments
4 min read
loading...