# Denys Ishchenko — complete site content > Denys Ishchenko is a product designer based in Luxembourg. He is a Senior User Experience Designer at PM-International, where he leads product experiences for around 500,000 monthly active users. He grew up in Ukraine, moved to Poland alone at 15 to study, and relocated to Luxembourg in 2023. He came to design through frontend development, spent 2020–2023 freelancing on 100+ end-to-end projects for clients in 15 countries, and won the 2025 Telegram Design Contest. Every page of www.heydenys.com in one file, in reading order. This is the whole site: there is nothing behind a link that is not already here. For the short version with guidance on when this site is worth consulting, see https://www.heydenys.com/llms.txt. Each section below is one page, headed by the URL it is served from. --- # Denys Ishchenko — Product Designer > Denys Ishchenko is a product designer based in Luxembourg. He is a Senior User Experience Designer at PM-International, where he leads product experiences for around 500,000 monthly active users. He grew up in Ukraine, moved to Poland alone at 15 to study, and relocated to Luxembourg in 2023. He came to design through frontend development, spent 2020–2023 freelancing on 100+ end-to-end projects for clients in 15 countries, and won the 2025 Telegram Design Contest. I'm Denys, a Product Designer currently based in Luxembourg. ## Selected work - **[Telegram Nodes: Design Contest](https://www.heydenys.com/telegram-contest)** — 4th place in the global Telegram Design Contest 2025, 100+ screens in two weeks. - **[FitLine: E-commerce Experience](https://www.heydenys.com/fitline)** — led the redesign of e-commerce, checkout and payment applications for 500,000 monthly active users in 45+ countries. - **[Monroe: Influencer Discovery](https://www.heydenys.com/monroe)** — influencer discovery platform from Washington, US. - **[PM Wiki: Help Center](https://www.heydenys.com/help-center)** — internal knowledge base for the company's customers. ## Playground Past projects, experiments, and things that didn't make it to production: https://www.heydenys.com/playground ## Kind words - **Jonny Netz** (Rematch (Acq'd), Zadart (Acq'd), Forbes Under 30 Scholar) — "He's creative, detail oriented, diligent, and very pleasant to work with." - **Alisa** (model, 100k+ followers on Instagram) — "From day One he showed his professionalism, 'can do' attitude, listened to all my ideas, went above and beyond." - **Igor Voitenko** (fitness YouTube creator, 5M+ followers) — "When I saw the final website, I almost launched into orbit." Contact: [me@heydenys.com](mailto:me@heydenys.com) — email only. --- # About Denys Ishchenko > Denys Ishchenko is a product designer based in Luxembourg. He is a Senior User Experience Designer at PM-International, where he leads product experiences for around 500,000 monthly active users. He grew up in Ukraine, moved to Poland alone at 15 to study, and relocated to Luxembourg in 2023. He came to design through frontend development, spent 2020–2023 freelancing on 100+ end-to-end projects for clients in 15 countries, and won the 2025 Telegram Design Contest. Hey, I'm Denys! I grew up in Ukraine but always dreamed of living abroad. So, at 15, I moved alone to Poland to study and it taught me independence and how to figure things out on my own. I discovered design through frontend development. Building things led me to Figma, where I found what I actually loved: designing products. What started as a hobby turned into full-time freelance work. In 2023, I moved to Luxembourg to work at PM-International, where I lead product experiences for 500k MAU. My office has people from 20+ countries, and being around so many cultures opened my mind in ways I didn't expect. Since October 2026, I'm also an ambassador for Projector's global community, bringing creative, tech and AI events to Luxembourg. The first ones are coming soon. 2025 Telegram Design Contest Winner. ## Experience ### Ambassador @ Prjctr Global Community *October 2026 – present* - Starting a Luxembourg chapter of Projector's global community: creative, tech and AI events for designers, developers and anyone curious about the field. The first events are coming soon. ### Senior User Experience Designer @ PM-International *April 2023 – present* - Led the full redesign of the FitLine e-commerce website (fitline.com, 500k+ monthly active users). - Designed PM Wiki, a knowledge hub that centralises company information for customers. - Designed a scalable design system covering both the PM-International and FitLine brands. ### Design Mentor @ Svitlo.Education *March 2023 – November 2023* - Mentored 25 students through two real portfolio projects; 80% completed both. ### Freelance Product Designer @ Independent *2020 – December 2023* - 100+ end-to-end design projects for clients across 15 countries, at a 95% client satisfaction rate. - Brief to delivery: research, wireframes, prototypes and UI design. ## Elsewhere - [LinkedIn](https://www.linkedin.com/in/denys-ishchenko/) - [Dribbble](https://dribbble.com/hey_denys) - [Behance](https://behance.net/hey_denys) - [Resume](https://docsend.com/view/xvzjt7fa86h8eu6c) --- # Playground A place for past projects, experiments, and things that didn't make it to production. The gallery holds 33 pieces of visual and product design work — landing pages, app concepts, e-commerce and brand explorations — shown without individual write-ups. Six tiles are short silent clips that run while the pointer is over them, or once their play control is pressed — the first five and one further down; the rest are stills. The first tile is the Telegram Nodes contest entry and links to its case study; the rest do not link anywhere. For work with documented process and outcomes, see: - [FitLine: E-commerce Experience](https://www.heydenys.com/fitline) - [Monroe: Influencer Discovery](https://www.heydenys.com/monroe) - [PM Wiki: Help Center](https://www.heydenys.com/help-center) - [Telegram Nodes](https://www.heydenys.com/telegram-contest) --- # FitLine: E-commerce Experience > Led the redesign of e-commerce, checkout and payment applications for 500,000 monthly active users across 45+ countries. - **Role:** Sole Product Designer - **Timeline:** 15 months - **Scale:** 500,000 MAU, 45+ countries ## Problem FitLine's e-commerce was outdated, visually unappealing, lacking many modern features. There were also two separate websites — one for marketing content and one for shopping. This created a disconnected experience that was hard to navigate and lacked the information customers needed to make confident purchases. ## Checkout and payments Redesigned the Checkout process and Payments to be faster, simpler, and more trustworthy. ## Mascots and the design system We worked together with our Graphic Designer to design custom mascots for empty states. Created a design system from scratch to unify visuals and interactions, streamline developer handoffs, and keep the shop consistent and scalable for future updates. ## Results - Average session engagement rate increased by XXX% - Accessibility score went up from 32 to 96 points ## What I took from it - Got better at presenting my design decisions to stakeholders - Learned how to balance design vision with technical limitations --- # Monroe: Influencer Discovery > Influencer discovery platform from Washington, US — product experience, UX flows and visual identity. - **Role:** Product Designer - **Timeline:** 4 months - **Date:** 2023 ## Problem Monroe is a platform based in Washington, USA, connecting brands to thousands of influencers. The founder, Jonny Netz, approached me to shape the entire product experience, from UX flows to visual identity. ## UI Elements The page closes on Monroe's UI elements: dropdowns, range sliders, search fields and filter lists. ## Results - 1,000+ social media creators joined the platform in the first 90 days - Monroe worked with brands including HelloFresh, Skillshare and ExpressVPN --- # PM Wiki: Help Center > Internal knowledge base for the company's customers — a scalable, multilingual help centre designed for PM International. - **Role:** Product Designer - **Timeline:** 3 months - **Scale:** 20+ languages ## Problem PM Wiki is the company's internal knowledge platform. I was asked to design it, making it scalable, user-friendly, and aligned with modern UX standards. The goal was to support global teams with a consistent and easy-to-use knowledge base in 20+ languages. ## Results - Reduced the number of support tickets - A centralised company knowledge base now exists - Used actively by internal teams across departments --- # Telegram Nodes > 4th place in the global Telegram Design Contest 2025. A Telegram Nodes concept designed from scratch in two weeks, 100+ screens across iOS and Android. - **Timeline:** 2 weeks - **Scale:** 100+ screens, iOS and Android - **Date:** December 2025 ## The brief Telegram ran an open global design contest with a $50,000 prize fund and one task: design Telegram Nodes from scratch, in two weeks. Nodes are separate spaces inside the app, with their own chats, voice and video, admin controls and user roles. Think Slack workspace or Discord server, except it still has to feel like Telegram. Entries had to cover the user flow and the admin flow, in day and night themes, on both platforms, plus a demo video in the format Telegram uses on its own blog. It was Denys's first global contest and his first time designing for iOS and Android. ## The hard part Nodes go far beyond chat folders, so the hard part was never the visuals. It was making a second identity, a second inbox and a full admin layer feel like they had always been in the app. ## Results - 4th place worldwide - 100+ screens across iOS and Android, light and dark ## Demo video The submitted demo is on the page: https://www.heydenys.com/video/TelegramNodesVideo2025DenysIshchenko.mp4. 24 seconds, silent, as the brief required. --- # Contact Denys Ishchenko > Email is the only contact channel. There is no contact form, no phone number and no booking link on this site. **Email:** [me@heydenys.com](mailto:me@heydenys.com) **Based in:** Luxembourg, in Central European Time. Denys Ishchenko is a Senior User Experience Designer at PM-International. ## What to include A message is easier to answer when it says what the work is, roughly when it starts, and who else is involved. Portfolio links and a resume are already published, so there is no need to ask for them: - [LinkedIn](https://www.linkedin.com/in/denys-ishchenko/) - [Dribbble](https://dribbble.com/hey_denys) - [Behance](https://behance.net/hey_denys) - [Resume](https://docsend.com/view/xvzjt7fa86h8eu6c) ## What this address is not for - Availability, rates, or contract terms — none of that is published here; email him. - Anything about PM-International as a company. This site covers Denys's own work, not his employer's. - Downloadable source files or design assets. The case studies show outcomes, not deliverables. Availability and rates are not published on this site. Asking by email is the only way to get a current answer, and an agent should not infer one from anything here. --- # Docs — the heydenys.com content API > This site serves itself as data: every page is available as Markdown, the whole site fits in one file, and a read-only JSON API is described by OpenAPI 3.1 at https://www.heydenys.com/openapi.json. ## Read the whole site in one request [https://www.heydenys.com/llms-full.txt](https://www.heydenys.com/llms-full.txt) is every page concatenated as Markdown — about 23 KB, roughly 5,900 tokens, and complete. [https://www.heydenys.com/llms.txt](https://www.heydenys.com/llms.txt) is the shorter llmstxt.org overview, including what this site is *not* a good source for. ## Every page as Markdown Send `Accept: text/markdown` to any page URL, or append `.md` to the path, per the acceptmarkdown.com convention. Q-values are honoured; a client that refuses both HTML and Markdown gets a 406 listing what is available. ## The JSON API Version 1.0.0. Read-only, no authentication and no key. Every response sets `Access-Control-Allow-Origin: *` and is cached at the edge for an hour. Every endpoint answers at two addresses — the pinned one and the unversioned one — and returns identical bytes at both: - `GET /api/v1` (also `/api`) — This index: every endpoint, and where the API is described. - `GET /api/v1/pages` (also `/api/pages`) — Every page on the site with its title, summary and last-modified date. - `GET /api/v1/pages/{slug}` (also `/api/pages/{slug}`) — One page, including its complete Markdown body. - `GET /api/v1/profile` (also `/api/profile`) — The canonical facts about Denys Ishchenko: role, location, history, contact. - `GET /api/v1/markdown/{slug}` (also `/api/markdown/{slug}`) — One page as raw Markdown, unwrapped. Start at [https://www.heydenys.com/api/v1](https://www.heydenys.com/api/v1), which lists all of it, including the two policies below. ## Versioning and deprecation `/api/v1/...` is pinned to the v1 response shapes and is the one to hard-code. `/api/...` serves the same bytes but always tracks the current major, so it is the convenient one and the one that can move under a client. Every JSON response states which shape produced it in the `API-Version` header. Nothing is deprecated. When something is, the responses that are going away start carrying `Deprecation` (RFC 9745) with the date the decision took effect and `Sunset` (RFC 8594) with the date they stop answering, at least 180 days apart, plus `Link: rel="deprecation"` pointing at the page that explains it. A breaking change to a response shape is not a deprecation: it is a new major at /api/v2, and /api/v1 keeps answering until its own Sunset date. Pin /api/v1 if that matters; /api/... without a version always tracks the current major. ## Rate limits 600 requests per 60 seconds per client address, enforced at the origin. Every JSON response carries the quota, readable from a browser too —`RateLimit-Policy: "content";q=600;w=60`, and `RateLimit-Limit: 600` for older clients — so a client can pace itself before its first failure. Successful responses are cached at the edge for an hour and mostly never reach the origin, so they are never counted. That is also why a cached 200 carries no live counter: a per-client number inside a shared-cached body would be about whoever missed the cache. The live `RateLimit` header appears on the responses that are `no-store` — every error, and the 429, which also carries `Retry-After` in seconds. Polling is the wrong shape for this site anyway. It is 12 pages that change a few times a year; [https://www.heydenys.com/llms-full.txt](https://www.heydenys.com/llms-full.txt) is all of them in one request. ## From the command line There is a one-file client, no install and no dependencies: ``` curl -fsSL https://www.heydenys.com/cli/heydenys.mjs -o heydenys.mjs node heydenys.mjs profile node heydenys.mjs page fitline node heydenys.mjs read ``` It calls the pinned base, honours `Retry-After`, and prints the API's own error hints. Node 18 or newer. It is not on npm. ## OpenAPI [https://www.heydenys.com/openapi.json](https://www.heydenys.com/openapi.json) — OpenAPI 3.1, with a unique operationId, a summary and a description on every operation, typed parameters and a response schema for every status, which is what makes it usable as a function-calling tool definition. The same document is served at https://www.heydenys.com/openapi.yaml and https://www.heydenys.com/api/openapi.json, and every page advertises it with `rel="service-desc"`. An agent holding nothing but the domain can also find all of it through the RFC 9727 catalogue at [https://www.heydenys.com/.well-known/api-catalog](https://www.heydenys.com/.well-known/api-catalog). ## Errors are JSON Every non-2xx response under `/api` uses one envelope: `error.status`, `error.code` (stable, matchable), `error.message`, `error.hint` naming a call that would have worked, and `error.documentation`. A 404 from `/api/pages/{slug}` also carries every slug that does exist. The one exception is a Markdown read of a page that does not exist, which answers 404 in Markdown, listing every page that does. ## What this API is not It is read-only and will stay that way. It publishes no availability, no rates and no contract terms — this site publishes none of those anywhere, so an answer inferred from it would be invented. Email me@heydenys.com for those. --- # Privacy > heydenys.com is a portfolio site. It sets no cookies and asks visitors for nothing. It counts visits anonymously with PostHog, to see which work people look at. ## What this site collects There are no cookies, no tracking pixels, no advertising networks, no embedded third-party widgets, and no forms. Nothing on this site asks a visitor for personal information. The one thing kept in the browser is the visitor's choice of light or dark theme, if they make one: the browser stores it for itself, it is sent nowhere, and it goes when the site's data is cleared. ## Analytics The site uses [PostHog](https://posthog.com/privacy) to see which pages and projects people look at. While a page is open it records the pages viewed, the links and buttons clicked, scroll depth, browser, device and screen size, the referring page, errors the page runs into, and the IP address with the approximate location derived from it. It may also record how a page is used — scrolling, clicks and pointer movement — so that a visit can be replayed. None of it carries a name or an email address. No cookie is set and nothing is written to browser storage for it, so a returning visitor is not recognised: each visit starts anonymous and ends when the tab closes. The data goes through this domain to PostHog, which processes it on servers in the United States under its own privacy policy. Blocking scripts on this site stops it entirely. ## What the host sees The site is served by Vercel. Like any web host, Vercel processes the technical details of a request — IP address, user agent, requested URL and timestamp — to deliver the page and to protect the service from abuse. That processing is Vercel's, described in [Vercel's privacy policy](https://vercel.com/legal/privacy-policy). This site adds no server logging of its own on top of it. ## Fonts and images Fonts are downloaded at build time and served from this domain, so loading a page makes no request to Google Fonts or any other font service. Images are served from this domain too. Links to LinkedIn, Dribbble, Behance, DocSend, Instagram, YouTube and fitline.com are ordinary links: nothing is sent to any of them unless the link is followed, at which point that service's own policy applies. ## Email Email sent to me@heydenys.com is read and kept only as long as needed to deal with what it is about. It is not added to a mailing list, and it is not shared or sold. ## Your rights For a question about the analytics above, to have email correspondence deleted, or for any other question about this notice, write to [me@heydenys.com](mailto:me@heydenys.com). ## Changes This notice describes the site as it is built. If what the site collects ever changes, this page changes first. --- # Generate — OKLCH palette generator > A side project of heydenys.com: a color palette in OKLCH from one base color. Nothing is stored; the URL holds the palette. The page builds a scale of steps around a base color, and keeps the base exactly: at the step it is anchored to (`at`), or wherever its lightness falls. Lightness follows Tailwind's own curve, so tints crowd toward white and the middle runs evenly; neutrals run darker at the bottom than colors. Every step takes the same share of the chroma its gamut (sRGB or Display P3) allows, with tints fading toward white, so a muted base gives a muted scale and no generated step is out of gamut. Hue drifts the way Tailwind's does, which keeps dark yellows golden rather than olive (`drift=none` holds it still). The model was fitted to Tailwind CSS v4 and checked against Radix Colors. Every step shows its value, its WCAG 2 contrast with white or black, and whether sRGB or Display P3 can show it. One color or the whole scale can be copied as CSS custom properties, a Tailwind v4 `@theme` block, W3C design tokens JSON, or a plain list. ## Building a palette by URL Every setting is a query parameter, so a link is a palette. Omitted parameters take their defaults; out-of-range values are clamped, and a decimal comma reads as a point. | Parameter | Meaning | Range | Default | | --- | --- | --- | --- | | `l` | base lightness, percent | 0–100 | 62 | | `c` | base chroma | 0–0.4 | 0.208 | | `h` | base hue, degrees | 0–360 | 259.6 | | `hex` | base as hex, without `#`; overrides l, c and h | 3 or 6 hex digits | — | | `at` | the step the base sits at, by its label: `500`, `9` | a step label | by the base's lightness | | `n` | number of steps | 3–20 | 11 | | `space` | gamut the scale fits | `srgb`, `p3` | `srgb` | | `light` | lightest step, percent | 50–100 | 98 | | `dark` | darkest step, percent | 0–50 | auto: 14 for a neutral to 27 for a colour | | `drift` | `none` holds the hue still; otherwise it drifts as hand-tuned scales do | `none` | drifts | | `shift` | a further straight hue rotation across the scale, degrees | -90–90 | 0 | | `names` | step labels: 50–950, or 1 to n | `tailwind`, `numeric` | `tailwind` | | `name` | palette name | a–z, 0–9, `-` | from the hue | | `format` | value notation shown and copied | `oklch`, `hex`, `rgb`, `p3` | `oklch` | | `bg` | background contrast is measured on | `white`, `black` | `white` | Examples: - [https://www.heydenys.com/generate?hex=0090ff&n=12&names=numeric](https://www.heydenys.com/generate?hex=0090ff&n=12&names=numeric) — twelve steps from a hex blue. - [https://www.heydenys.com/generate?l=70&c=0.15&h=150&space=p3](https://www.heydenys.com/generate?l=70&c=0.15&h=150&space=p3) — a green fitted to Display P3. - [https://www.heydenys.com/generate?hex=1e3a5f&at=900&name=navy](https://www.heydenys.com/generate?hex=1e3a5f&at=900&name=navy) — a navy brand color as the 900 of a scale named navy. The palette itself is computed in the browser; this document does not contain it. --- # Library — reference palettes in OKLCH > Two published palettes on heydenys.com's generator, every step copyable as OKLCH or hex. The values come from each library's own files, read by a script rather than typed: Tailwind's from the installed `tailwindcss` package, which authors its palette in OKLCH, and Radix's from its npm release, checked against the published integrity. Each scale links into [the generator](https://www.heydenys.com/generate) with its base step — Radix's 9, Tailwind's 500 — as the base color. ## Radix Colors Version 3.0.0, MIT, [radix-ui.com/colors](https://www.radix-ui.com/colors). 31 scales of 12 steps, 1 to 12, each with a light and a dark variant: gray, mauve, slate, sage, olive, sand, tomato, red, ruby, crimson, pink, plum, purple, violet, iris, indigo, blue, cyan, teal, jade, green, grass, brown, bronze, gold, sky, mint, lime, yellow, amber, orange. ## Tailwind CSS Version 4.3.2, MIT, [tailwindcss.com/docs/colors](https://tailwindcss.com/docs/colors). 26 scales of 11 steps, 50 to 950: red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose, slate, gray, zinc, neutral, stone, mauve, olive, mist, taupe. ## References - [CSS Color 4: OKLab and OKLCH](https://www.w3.org/TR/css-color-4/#ok-lab), the specification, gamut mapping included. - [A perceptual color space for image processing](https://bottosson.github.io/posts/oklab/), Björn Ottosson's introduction of OKLab. - [OKLCH in CSS: why we moved from RGB and HSL](https://evilmartians.com/chronicles/oklch-in-css-why-quit-rgb-hsl), Evil Martians. - [oklch.com](https://oklch.com), a picker and converter; [oklch.fyi](https://oklch.fyi), palettes, conversion and a gamut visualizer.