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
Back to blog.beraliv.dev
Blog · corpus.blog/blogs/blog.beraliv.dev/posts

blog.beraliv.dev

blog.beraliv.dev

2025

2023

2022

2021

2020

2019

2018