41554 blogs · [
{
"id": "01a08744-7a62-714f-b09b-1a1bac1ee4b5",
"title": "How I Earned the UK Global Talent Visa (Exceptional Talent)",
"url": "https://blog.beraliv.dev/2025-04-23-how-i-earned-uk-global-talent-visa",
"published_at": "2025-04-23T00:00:00+00:00"
},
{
"id": "01a08744-7a62-714f-b09b-1a1bac84a208",
"title": "A story of an unknown low-tier device and its MSE issues / London Video Tech 2023 notes",
"url": "https://blog.beraliv.dev/2023-12-21-story-of-unknown-low-tier-device-and-its-mse-issues-lvt-notes",
"published_at": "2023-12-21T00:00:00+00:00"
},
{
"id": "01a08744-7a62-714f-b09b-1a1bad1554f2",
"title": "With or without enums in TypeScript",
"url": "https://blog.beraliv.dev/2022-09-10-with-or-without-enums",
"published_at": "2022-09-10T00:00:00+00:00"
},
{
"id": "01a08744-7a62-714f-b09b-1a1badbc3466",
"title": "Transform string literal type into camelCase in TypeScript",
"url": "https://blog.beraliv.dev/2022-07-14-camel-case",
"published_at": "2022-07-14T00:00:00+00:00"
},
{
"id": "01a08744-7a62-714f-b09b-1a1badcbca00",
"title": "Advanced types / Holy.js 2021 notes",
"url": "https://blog.beraliv.dev/2021-12-10-advanced-types-holyjs-notes",
"published_at": "2021-12-10T00:00:00+00:00"
},
{
"id": "01a08744-7a62-714f-b09b-1a1bae5fdddd",
"title": "Extract object type with optional fields in TypeScript",
"url": "https://blog.beraliv.dev/2021-12-07-get-optional",
"published_at": "2021-12-07T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252b490e7c",
"title": "Convert string literal type into number literal type in TypeScript",
"url": "https://blog.beraliv.dev/2021-12-03-string-to-number",
"published_at": "2021-12-03T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252ba8d13f",
"title": "Split string literal type in TypeScript",
"url": "https://blog.beraliv.dev/2021-11-29-split",
"published_at": "2021-11-29T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252c405e15",
"title": "Filter tuple type in TypeScript",
"url": "https://blog.beraliv.dev/2021-11-27-tuple-filter",
"published_at": "2021-11-27T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252c4548ef",
"title": "TypeScript spread operator for 2 object types",
"url": "https://blog.beraliv.dev/2021-07-05-spread-in-typescript",
"published_at": "2021-07-05T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252cc2cea0",
"title": "Math.abs for string literal type in TypeScript",
"url": "https://blog.beraliv.dev/2021-06-21-absolute-in-typescript",
"published_at": "2021-06-21T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252cfb4c60",
"title": "Transform string literal type into union of characters in TypeScript",
"url": "https://blog.beraliv.dev/2021-06-19-making-union-out-of-string",
"published_at": "2021-06-19T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252d4673d4",
"title": "Append key-value pair to object type in TypeScript",
"url": "https://blog.beraliv.dev/2021-06-16-append-to-object",
"published_at": "2021-06-16T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252e40e863",
"title": "Flatten tuple type of tuples in TypeScript",
"url": "https://blog.beraliv.dev/2021-06-13-flatten-tuple-type-in-typescript",
"published_at": "2021-06-13T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252ea443e2",
"title": "Infer string length in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-31-string-length-in-typescript",
"published_at": "2021-05-31T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252efd53d7",
"title": "Calculate all permutations of union type in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-30-permutations-in-typescript",
"published_at": "2021-05-30T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252f1d33a6",
"title": "Append argument type into function type in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-23-append-argument",
"published_at": "2021-05-23T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252f6ab10c",
"title": "Replace all occurrences in string literal type in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-22-replace-all-occurrences-in-a-string-in-typescript",
"published_at": "2021-05-22T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db252faf0c46",
"title": "Replace occurrence in string literal type in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-17-replace-occurrence-in-a-string-in-typescript",
"published_at": "2021-05-17T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db25303c616f",
"title": "Intrinsic string manipulation types in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-14-type-aliases-for-string-manipulation",
"published_at": "2021-05-14T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2530a0360e",
"title": "Trim string literal type in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-11-trim-in-typescript",
"published_at": "2021-05-11T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2530bc5107",
"title": "Trim left part of string literal type in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-10-trim-left-in-typescript",
"published_at": "2021-05-10T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253175cbba",
"title": "Opaque Types in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-07-opaque-type-in-typescript",
"published_at": "2021-05-07T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2532251b41",
"title": "Extract under the hood in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-06-extract-under-the-hood",
"published_at": "2021-05-06T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2532408066",
"title": "Promise.all types under the hood in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-04-promise-all-under-the-hood",
"published_at": "2021-05-04T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253262565d",
"title": "Manipulation with elements of tuple type in TypeScript",
"url": "https://blog.beraliv.dev/2021-05-01-manipulation-with-tuple-elements",
"published_at": "2021-05-01T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db25329e32f8",
"title": "Infer last element of tuple type in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-29-infer-last-element",
"published_at": "2021-04-29T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2533517e4e",
"title": "Chainable options type in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-28-chainable-options",
"published_at": "2021-04-28T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2533afb236",
"title": "Transform tuple type into a union in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-27-making-union-out-of-tuple",
"published_at": "2021-04-27T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2533da4ed7",
"title": "Recursive readonly object type in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-25-recursive-readonly-for-objects",
"published_at": "2021-04-25T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2534c05acc",
"title": "Conditionally readonly object type in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-23-partial-readonly",
"published_at": "2021-04-23T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db25350f14c7",
"title": "Omit type under the hood in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-21-omit-under-the-hood",
"published_at": "2021-04-21T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2535f9bdeb",
"title": "ReturnType under the hood in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-19-return-type-under-the-hood",
"published_at": "2021-04-19T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2536a5a292",
"title": "Includes type in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-16-includes-in-typescript",
"published_at": "2021-04-16T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2536ecb2bd",
"title": "TypeScript spread operator for 2 tuple types",
"url": "https://blog.beraliv.dev/2021-04-15-spread-in-tuple-types-in-typescript",
"published_at": "2021-04-15T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db25377b4ca3",
"title": "If statement type in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-14-boolean-condition",
"published_at": "2021-04-14T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db25379217e6",
"title": "Awaited type under the hood in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-13-unwrapping-promises",
"published_at": "2021-04-13T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2537e39726",
"title": "Exclude type under the hood in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-12-exclude-under-the-hood",
"published_at": "2021-04-12T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2538a32d2e",
"title": "Infer tuple length in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-09-infer-length",
"published_at": "2021-04-09T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2539223cb7",
"title": "Infer first element of tuple type in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-08-infer-first-element",
"published_at": "2021-04-08T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db25392c7299",
"title": "Transform tuple type into object type with same key and value in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-07-making-object-out-of-tuple",
"published_at": "2021-04-07T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db25394057b9",
"title": "Readonly type under the hood in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-06-readonly-under-the-hood",
"published_at": "2021-04-06T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db2539e6b8e0",
"title": "Pick type under the hood in TypeScript",
"url": "https://blog.beraliv.dev/2021-04-05-pick-under-the-hood",
"published_at": "2021-04-05T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253a6429b8",
"title": "List of Type Challenges problems and solutions",
"url": "https://blog.beraliv.dev/2021-04-04-type-challenges",
"published_at": "2021-04-04T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253aafa9a2",
"title": "Type-safe get function that extracts the value by paths in TypeScript",
"url": "https://blog.beraliv.dev/2021-03-26-typed-get",
"published_at": "2021-03-26T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253af851d5",
"title": "Working in Video Advertising player at Yandex",
"url": "https://blog.beraliv.dev/2020-10-06-work-in-video-advertising-player-in-yandex",
"published_at": "2020-10-06T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253b003d2a",
"title": "Code obfuscation in Joyn video player (2020 edition)",
"url": "https://blog.beraliv.dev/2020-05-04-research-joyn-scripts-obfuscation",
"published_at": "2020-05-04T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253b35b495",
"title": "Subtitles, statistics and DRM in Udemy video player (2020 edition)",
"url": "https://blog.beraliv.dev/2020-01-07-whats-inside-udemy-player",
"published_at": "2020-01-07T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253b392f36",
"title": "Geolocation identification in BBC iPlayer (2019 edition)",
"url": "https://blog.beraliv.dev/2019-12-22-bbc-iplayer-geolocation-identification",
"published_at": "2019-12-22T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253c24ec68",
"title": "State machine and bundles in Amazon video player (2019 edition)",
"url": "https://blog.beraliv.dev/2019-12-17-amazon-prime-video-player-investigation",
"published_at": "2019-12-17T00:00:00+00:00"
},
{
"id": "01a08744-7a63-73b4-85ff-db253cc46a95",
"title": "Scrollbar customisation in CSS and JS",
"url": "https://blog.beraliv.dev/2018-10-04-scrollbar-customisation",
"published_at": "2018-10-04T00:00:00+00:00"
}
] posts Claim your blog