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

33 pages on our site carry an Offer pointing at /pricing, and /pricing is one of the five carrying none

33 pages on our site carry an Offer pointing at /pricing, and /pricing is one of the five carrying none

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
A 794-line design report decided our colours and fonts, and I can now grep for which of its rules survived

A 794-line design report decided our colours and fonts, and I can now grep for which of its rules survived

Comments
6 min read
One line in next.config.mjs put 617 memo slots into our JavaScript, and 63 of them are in a tool that adds up minutes

One line in next.config.mjs put 617 memo slots into our JavaScript, and 63 of them are in a tool that adds up minutes

Comments
4 min read
I counted our link graph from the source five days ago, then from the live HTML, and the worst page is a different one

I counted our link graph from the source five days ago, then from the live HTML, and the worst page is a different one

1
Comments
6 min read
Disallow: /device-limit/ blocks nothing, and the list right above it has both /admin and /admin/

Disallow: /device-limit/ blocks nothing, and the list right above it has both /admin and /admin/

Comments
4 min read
subsets in next/font is a preload list, not a download filter: 3 families, 20 font-face rules, 17 files

subsets in next/font is a preload list, not a download filter: 3 families, 20 font-face rules, 17 files

Comments
6 min read
The light theme I said was unreachable is what three of our pages have been rendered in all along

The light theme I said was unreachable is what three of our pages have been rendered in all along

Comments
4 min read
The ampersand that broke next/font/google is still in our repo, in the one script that renders our social card

The ampersand that broke next/font/google is still in our repo, in the one script that renders our social card

Comments
6 min read
Our landing page is 596 KB of HTML with no images in it, and 226 KB of that is the same line art twice

Our landing page is 596 KB of HTML with no images in it, and 226 KB of that is the same line art twice

Comments
4 min read
Loading one 13 KB page on our site fetches 37 KB of pages nobody asked for, in 21 requests for 7 destinations

Loading one 13 KB page on our site fetches 37 KB of pages nobody asked for, in 21 requests for 7 destinations

Comments
5 min read
All 59 timestamp columns in our schema are without time zone, and the public API still appends a Z

All 59 timestamp columns in our schema are without time zone, and the public API still appends a Z

Comments
5 min read
Gmail clips a message at 102KB, and our alert email runs out of room between 136 and 208 listings

Gmail clips a message at 102KB, and our alert email runs out of room between 136 and 208 listings

Comments
6 min read
Our updated_at is maintained by the ORM, not the database, and 10 of 25 tables have one

Our updated_at is maintained by the ORM, not the database, and 10 of 25 tables have one

Comments
4 min read
Two of our sixteen npm scripts call files that are not in the repository, and one of them has been broken since the day it was written

Two of our sixteen npm scripts call files that are not in the repository, and one of them has been broken since the day it was written

Comments
6 min read
Three of the five text colours in our alert emails fail WCAG AA, and the one that tells you which search it came from is 2.29:1

Three of the five text colours in our alert emails fail WCAG AA, and the one that tells you which search it came from is 2.29:1

Comments
6 min read
Our FAQ is a details element: 337 of them across 66 of our 76 public pages

Our FAQ is a details element: 337 of them across 66 of our 76 public pages

Comments
5 min read
Our footer disclaims affiliation with every vendor, and our JSON-LD lists two of them as our other names

Our footer disclaims affiliation with every vendor, and our JSON-LD lists two of them as our other names

Comments
5 min read
A session reaches our app four different ways, and detectSessionInUrl is off so one function can own all of them

A session reaches our app four different ways, and detectSessionInUrl is off so one function can own all of them

Comments
7 min read
Our Windows installer is 56 days older than our Mac one, and nothing in the product can say so

Our Windows installer is 56 days older than our Mac one, and nothing in the product can say so

Comments
6 min read
Our blog's RSS feed is one string join, and all five posts in it share one pubDate

Our blog's RSS feed is one string join, and all five posts in it share one pubDate

Comments
5 min read
Our camera screen sets autofocus to off, and that is the setting that keeps focusing

Our camera screen sets autofocus to off, and that is the setting that keeps focusing

Comments
8 min read
Delete a round from our planner and the interval disappears, and two rows that both say 8 min are seven minutes apart

Delete a round from our planner and the interval disappears, and two rows that both say 8 min are seven minutes apart

Comments
5 min read
Our privacy policy lists the two things we do when it changes, and the last change did neither

Our privacy policy lists the two things we do when it changes, and the last change did neither

Comments
5 min read
Our on-device product cache key ends in v3, because a field that is absent reads as an answer

Our on-device product cache key ends in v3, because a field that is absent reads as an answer

Comments 1
7 min read
One rule in our Next config caches a folder we do not have for a year, and the only thing it caches is a redirect to the login form

One rule in our Next config caches a folder we do not have for a year, and the only thing it caches is a redirect to the login form

Comments
5 min read
The file that governs 132 pages is imported by seven of them, and one page claims what it refuses to

The file that governs 132 pages is imported by seven of them, and one page claims what it refuses to

Comments
5 min read
Every clip in our video package declares durationInFrames 1, and that is also how the render script tells a clip from an icon

Every clip in our video package declares durationInFrames 1, and that is also how the render script tells a clip from an icon

Comments
7 min read
Forwarding inbound mail from our own domain switched off the receiving inbox's spam filter, and the support address was replying to the pitches

Forwarding inbound mail from our own domain switched off the receiving inbox's spam filter, and the support address was replying to the pitches

Comments 1
7 min read
Our Export button asks for 1,000 audit rows, the route caps it at 100, and the page says all

Our Export button asks for 1,000 audit rows, the route caps it at 100, and the page says all

Comments 2
5 min read
Our admin allowlist is one address in a source file, and the signed-out visitor is the only person we tell anything

Our admin allowlist is one address in a source file, and the signed-out visitor is the only person we tell anything

Comments
7 min read
Our free-licence script prints a token on every run, and in a dry run that token is either real or imaginary

Our free-licence script prints a token on every run, and in a dry run that token is either real or imaginary

Comments
6 min read
Our comparison pages tell the reader September and the crawler October, and both dates are true

Our comparison pages tell the reader September and the crawler October, and both dates are true

Comments
6 min read
One include glob pulls our other server's source into the Next.js type check, and the two compilers disagree on ten options

One include glob pulls our other server's source into the Next.js type check, and the two compilers disagree on ten options

Comments
5 min read
A 60 character title budget, a 12 character brand suffix, and the 2 pages out of 507 where the brand loses

A 60 character title budget, a 12 character brand suffix, and the 2 pages out of 507 where the brand loses

Comments
8 min read
The three pages on our site that show a price are the three with no font preload in the head

The three pages on our site that show a price are the three with no font preload in the head

Comments
4 min read
Our Tailwind config is a v3 file that v4 reads through one @config line, and I measured which of its 80 lines reach the browser

Our Tailwind config is a v3 file that v4 reads through one @config line, and I measured which of its 80 lines reach the browser

Comments
6 min read
Fourteen call sites make the metadata for 76 pages, and every canonical URL names production

Fourteen call sites make the metadata for 76 pages, and every canonical URL names production

Comments
6 min read
Our IndexNow submitter reads the live sitemap rather than importing it, and the one engine we care about ignores the whole protocol

Our IndexNow submitter reads the live sitemap rather than importing it, and the one engine we care about ignores the whole protocol

Comments
6 min read
Our free tier is five scans a month and the phone counts them, because the server is not allowed to know how many you did

Our free tier is five scans a month and the phone counts them, because the server is not allowed to know how many you did

Comments
8 min read
cache() memoises a function, not a query, so our two wrappers over one row by id fetched it twice

cache() memoises a function, not a query, so our two wrappers over one row by id fetched it twice

Comments
5 min read
Our plan limits have no counter column, the rows are the count, and a refund is a DELETE

Our plan limits have no counter column, the rows are the count, and a refund is a DELETE

Comments
7 min read
One mug, four files: our favicon.ico is a PNG, and two of the SVGs differ by a line that changes nothing

One mug, four files: our favicon.ico is a PNG, and two of the SVGs differ by a line that changes nothing

Comments
5 min read
Our crawler check is one regex with "bot" in it, so a phone called Cubot is quoted pounds

Our crawler check is one regex with "bot" in it, so a phone called Cubot is quoted pounds

Comments
5 min read
Our next/image config is an allowlist: 16 widths and 5 qualities answer 200, everything else answers 400

Our next/image config is an allowlist: 16 widths and 5 qualities answer 200, everything else answers 400

Comments
4 min read
One caveat sentence, three wordings of it in our code, and the only test asserts the five words all three share

One caveat sentence, three wordings of it in our code, and the only test asserts the five words all three share

Comments
8 min read
Our email preview is not a likeness of the email, it is the email, and a determinism test says so

Our email preview is not a likeness of the email, it is the email, and a determinism test says so

Comments
7 min read
Exact-match says 2 duplicated sentences in 628 across our 67 pages, and the real answer is 5 of 6 paragraphs on one page

Exact-match says 2 duplicated sentences in 628 across our 67 pages, and the real answer is 5 of 6 paragraphs on one page

Comments
5 min read
Our skip link is the first tab stop on 375 pages and its target exists on four of them

Our skip link is the first tab stop on 375 pages and its target exists on four of them

Comments
4 min read
The price in our desktop app is a string the server hands it, and the one case where it has no string is a 409

The price in our desktop app is a string the server hands it, and the one case where it has no string is a 409

Comments
6 min read
Our website names who each recipe suits and our app names nobody, from the same 38 recipes in the same package

Our website names who each recipe suits and our app names nobody, from the same 38 recipes in the same package

Comments
9 min read
All 67 of our content pages pass the prop, so the fallback behind it has never rendered, and it is a copy of the homepage

All 67 of our content pages pass the prop, so the fallback behind it has never rendered, and it is a copy of the homepage

Comments
5 min read
Our maintenance switch is one boolean, and the only alert email that survives it is the one allowed to throw

Our maintenance switch is one boolean, and the only alert email that survives it is the one allowed to throw

Comments
6 min read
65 calls go through our toast helper and 36 skip it, and the two paths format errors differently

65 calls go through our toast helper and 36 skip it, and the two paths format errors differently

Comments
5 min read
One punctuation mark is banned from our copy, three unrelated tests enforce it, and the app with most of the words in it is not one of them

One punctuation mark is banned from our copy, three unrelated tests enforce it, and the app with most of the words in it is not one of them

Comments
8 min read
We publish one email address and label sixteen, because a catch-all means every local part arrives

We publish one email address and label sixteen, because a catch-all means every local part arrives

Comments
7 min read
Reduce Motion stops every CSS animation on our site and none of the JavaScript ones

Reduce Motion stops every CSS animation on our site and none of the JavaScript ones

Comments
5 min read
Send the link again has five limits on it, and only two of them are in the browser

Send the link again has five limits on it, and only two of them are in the browser

Comments
6 min read
One file is copied into five repositories, and the only line allowed to differ is the one naming which app you are reading

One file is copied into five repositories, and the only line allowed to differ is the one naming which app you are reading

Comments
8 min read
Two search fields in one form, one searching as you type and one waiting until you ask

Two search fields in one form, one searching as you type and one waiting until you ask

Comments
7 min read
Our sign-in page has 0 autocomplete attributes, and the password field is not in the HTML at all

Our sign-in page has 0 autocomplete attributes, and the password field is not in the HTML at all

1
Comments 1
4 min read
loading...