Dominik Hryshaiev

Dominik Hryshaiev

@domhhv.com

Full-stack developer passionate about open source, TypeScript, and React ex-Waze, ex-Unstoppable Domains Available for hire Playing PS5 and PC games in my free time domhhv.com

22 followers44 following66 posts

Not sure what's worse: having tried Fable and mourning its loss, or never even having had the chance to try it. At least I was able to finally resume my GitHub Copilot subscription today, as they're gradually rolling it out again. Back at it!

TIL: backdrop-filter creates a new containing block for descendants with position: fixed. I had buttons in my <header /> that should've been fixed to the bottom of the viewport on mobile. But they kept sticking to the top instead — right under the navbar.

View full thread

HeroUI's Navbar in my app had backdrop-filter property set on the <nav />, trapping my fixed <div /> inside it. In the end, I fixed the issue by dropping that backdrop-filter value. The issue wasn't the position all along.

Figured this out with Claude Code and Chrome DevTools MCP. It inspected the computed styles and fixed the issue with Tailwind — all in one flow. One of my most favorite MCPs. But I still went with a simpler solution: passing isBlurred=false to the HeroUI's Navbar.

TIL: backdrop-filter creates a new containing block for descendants with position: fixed. I had buttons in my <header /> that should've been fixed to the bottom of the viewport on mobile. But they kept sticking to the top instead — right under the navbar.

I kept debugging and inspecting every ancestor of the buttons for position values, made sure that all were static. But the buttons still sticked to the header instead of the bottom of the page on mobile.

So it turns out that any ancestor with backdrop-filter (also transform, filter, perspective, contain: paint, or will-change) creates a new containing block for fixed elements — regardless of its own position value.

Postgres doesn't have MySQL's ON UPDATE CURRENT_TIMESTAMP for auto-updating timestamps. Here's the pattern I use in every project - one reusable function, attach to any table that needs it. No client-side date logic needed.

A small UX detail I like to implement in every app with tooltips: smart delays without flickers. First hover → normal delay (e. g. 500ms) Moving between adjacent buttons → instant Leave and return → delay resets 30 second demo + the React hook that makes it work 👇

View full thread

A small UX detail I like to implement in every app with tooltips: smart delays without flickers. First hover → normal delay (e. g. 500ms) Moving between adjacent buttons → instant Leave and return → delay resets 30 second demo + the React hook that makes it work 👇

The trick: track whether user is "in the group". Once they've triggered one tooltip, skip delays for subsequent items until they leave. When mouse leaves the group, start a short window (e. g. 300ms) before resetting. This handles accidental mouse-outs.

Agents need explicit constraints + tests, CI, and docs as oracles, not just "build X". Breaking complex features into adjacent-possible steps with tight feedback loops is better than vague prompts hoping for magic.

Shipped a thing: emailcompat.dev Paste your email HTML, see what breaks in Gmail/Outlook/Apple Mail before you send. Built this for a job interview, got rejected, released it anyway. Some wild discoveries - Outlook literally uses Microsoft Word to render emails. In 2025. Free, open source.

React + Framer Motion? Skip the carousel libraries. This ~40-line snippet gives you clean directional animations with zero extra deps. Sometimes DIY is just better.

Refactored my Supabase client setup into a Singleton. Now there's a single source of truth, safe test behavior, and early error handling for misconfig. One client across the app, no accidental re-creates — a clean, practical use of the pattern.

Here's a brief explanation: - Private Constructor: Prevents direct instantiation of the class. - Static Method `getInstance()`: Provides a global point of access to the instance. - Single Instance: Ensures only one instance is created and reused.

I've decided to stick with explicit arrow function bodies in JS/TS—always using curly braces and a return. It might feel more verbose, but it keeps the Git diffs clean and makes adding logic later a breeze. Luckily, ESLint has a rule just for that. #JavaScript #TypeScript #CleanCode

Have a JavaScript-heavy project that uses @supabase.com and wish you could lint your migrations and seeds like you do with ESLint? I just set up SQLFluff in my app using Docker, Husky, lint-staged, and GitHub Actions to achieve consistency in my SQL code. Sharing my setup here in case it helps ↓

View full thread

Lastly, SQLFluff isn’t perfect — I’ve hit walls with parsing Postgres functions (especially with plpgsql). I also had to learn how -- noqa works to ignore specific lines. E.g. -- noqa: CV10 next to a line disables rule on quoted literals for it. Still worth it. Would do again. Hope this helped!

Have a JavaScript-heavy project that uses @supabase.com and wish you could lint your migrations and seeds like you do with ESLint? I just set up SQLFluff in my app using Docker, Husky, lint-staged, and GitHub Actions to achieve consistency in my SQL code. Sharing my setup here in case it helps ↓

View full thread

I use Husky to run SQLFluff in pre-commit hooks with lint-staged. Here's my lint-staged.config.js. There's also a fix to transform the absolute paths to relative ones since when we run the command inside the Docker container, the paths are relative to the mounted volume, not our local file system.

I also added SQLFluff to CI so migrations and seeds are linted on every PR. This runs SQLFluff via `pip` in GitHub Actions. Here's the GitHub workflow config. Takes 20 lines and saves headaches in prod.

Have a JavaScript-heavy project that uses @supabase.com and wish you could lint your migrations and seeds like you do with ESLint? I just set up SQLFluff in my app using Docker, Husky, lint-staged, and GitHub Actions to achieve consistency in my SQL code. Sharing my setup here in case it helps ↓

SQLFluff is a linter & formatter for SQL, customizable and dialect-aware (Postgres in the case of Supabase). You can run it via Docker (they provide an official image) or install it globally via pip/brew. It reads from .sqlfluff config file in the root of your app. Here’s what mine looks like.

I added two npm scripts to my package.json to run SQLFluff with Docker: - lint:sql (to lint files) - fix:sql (to auto-format them) So I don’t have to install Python or pip—just Docker. Those commands automatically detect .sql files but can also take a path to a specific one as an argument.

10 years (+1 week, totally forgot to post on the exact anniversary 😅) ago, as a CS sophomore, I signed up on Codecademy & got hooked on JS, HTML & CSS. Spent nights solving exercises—now I’m a Full-Stack Engineer, still just as excited about coding as I was back in my tiny dorm room. Time flies! 🚀

PSN might be down, but it’s given me a moment to really appreciate the physical collection I’ve gathered. Owning discs means you can dive into your favourite worlds notwithstanding network issues. There's something timeless about having these gems on the shelf. Stay patient out there, gamers! 💿 🎮

Thankfully, my gaming PC is also helping me get through the PSN downtime. Between Steam, EA, Epic Games and other launchers, there’s always something to play! How’s everyone else holding up? 🎮 💻

Received this classic yesterday. It's not new to me as I attempted reading it somewhere in 2017 when I was still a junior. I just couldn't bear with its complexity back then 😅 I'm about to give it another try now with hopes that being more seasoned and knowledgeable dev, I'll process it, bit by bit

Got this super-cool art book today and already read through half of it. Returnal's probably my favorite game ever, and this book beautifully captures how well-designed it is—from the hostiles and weapons to the breathtaking landscapes. I hope Housemarque makes a sequel of this masterpiece someday 🐙

Naughty Dog just announced their new IP titled Intergalactic: The Heretic Prophet. I'm especially thrilled about the cast we know so far (Tony Dalton from Better Call Saul and, of course, Troy Baker) + OST covered by Trent Reznor and Atticus Ross.

This script: - Switches to `main` by default (or any branch you prefer). - Pulls the latest changes with rebase. - Deletes the old branch. - Optionally stashes and pops local changes if needed (just add --stash). Hopefully, it helps your productivity as well if you've faced the same problem!

While I came here to post about dev (and to escape x ofc:), algos & my love for games had other plans 😅 So, I’m going 2-fold: dev & gaming! My fav: TLOU GoW Returnal Cyberpunk 2077 High on Life Spider-Man Hogwarts Legacy Stray Stellar Blade GTA V NFS Ratchet & Clank Sackboy Astro It Takes Two

And since I only got my first ever PlayStation last summer (last gamed on PC in 2017 before that), this list is really all my favorites so far. Of course, I’ve had a chance to play other games too, but these stood out the most. Meaning, no character limit constraints here 😄

A few weeks ago, I used ES6 generators for the first time in my career. First of, it felt amazing (hoping Symbols get their turn!). Secondly, I wanted to share a practical use case in the context of a React app.

View full thread

I didn't like having such a long function in my React component, but I didn't know how to extract it since I needed to sequentially update the status state upon each async step complete. And then I remembered about generators.

So, here's a simplified version of what I eventually came up with. I'm not sure it's the most elegant way to solve the problem. But I enjoyed trying out and getting the hang of a modern and niche JS feature while building something! So I thought I'd share in hopes it could prove useful to some.

A few weeks ago, I used ES6 generators for the first time in my career. First of, it felt amazing (hoping Symbols get their turn!). Secondly, I wanted to share a practical use case in the context of a React app.

I was implementing a complex flow where a user provides a prompt in the UI, then I programmatically enhance it and attach some context, and then start a long-running process where I feed this data to an LLM, wait for the response, then feed it to another LLM (potentially changing it), and so forth.

It was a huge function with many steps. I would repeatedly call different LLM APIs, and each step needed the result of the previous one, with some sync actions in between. Before each async step, I would set a status state and render it to inform the user of the currently performing step.

Hello world! 🦋 I'm here to explore and share tips on front-end and back-end dev. I'm into scalable and cloud-native architectures, data engineering, API-driven interactions, DX, performance, delivering flawless UX, and many more. Let's connect and push the boundaries of what's possible! 🚀

You are up to date.