Sitelet https://github.com/wonchoe
Skip to content
View wonchoe's full-sized avatar
  • Bradenton
  • 10:06 (UTC -04:00)
  • Instagram wonchoe

Block or report wonchoe

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
wonchoe/README.md
Oleksii Semeniuk - playful products up front, edge, cluster and pipelines behind

cursor.style LinkedIn Telegram Followers Profile views Traffic sync

What I do

I build browser products for people who are mostly not developers - a kid picking a rainbow cursor, a teenager reskinning their YouTube player - and I run everything underneath them myself: Cloudflare at the edge, k3s and Argo CD in the middle, MySQL, MongoDB and object storage at the back.

So the interesting problems are rarely the pretty ones. Judging every photo and message in the room before anyone else sees it. Keeping one container image from eating a node. Serving nine figures of requests a month on a budget that would make a funded startup laugh.

What I run

Product What it is Reach
cursor.style The largest free cursor library, plus the extension that applies them users rating
cursor-land.com Second cursor brand - same engine, its own audience users rating
youtube-skins.com 130+ skins for the YouTube player, and an ad skipper beside it users rating
fb.zone Video and photo background themes for Facebook users rating
Chat Moderated rooms, direct messages, photo albums and WebRTC calls, built into the main site rooms, DMs, group voice
Slither Free multiplayer snake, no install, no account live on the games hub
Terra Open 3D world you can run around in, built on streamed low-poly terrain in preview
agropost.com.ua Ukrainian agricultural marketplace: listings, company catalogue, grain logistics running since 2010
agro-post.com The same platform for the US market live

Counts and ratings are pulled live from the Chrome Web Store every time this page loads.

The one that got big

cursor.style v5
cursor.style traffic over the last 30 days

386,356,707 requests  ·  20,478,940 page views  ·  3,913,964 unique visitors   over the last 30 days

Yesterday alone: 21,003,914 requests from 124,218 people. Refreshed 2026-10-09 by the workflow above.

The one with the moderation problem

The chat grew out of the cursor library and runs in the same pod as the site: rooms, direct messages, photo albums, group voice and WebRTC calls, in 49 languages. Most of the people in it are teenagers, and that one fact decides almost everything about how it has to be built.

So the hard part was never the sockets. It is that every username, every message and every photo has to be judged before anyone else sees it, in languages I do not read, in under a second, at a cost per item of approximately nothing.

Layer What runs
Photos OpenAI omni-moderation-latest, with per-category score thresholds measured against real uploads rather than guessed
A second opinion on photos Amazon Rekognition, wired in beside it and running in shadow: it logs its labels and decides nothing until they prove the thresholds. The two miss different things - a real shotgun scored 0 at OpenAI and 100 at Rekognition, which is the whole argument for keeping both
Text The same moderation model, then gpt-4o-mini on what scores zero and is still a problem: a phone number handed over in a direct message, or an intent that only reads as harmful in the language it was written in
Words A two-level dictionary per language, because in some of them a slur is one space away from an ordinary phrase, and a naive filter bans half the room
Reports Triaged automatically before a human opens them, with a ladder of sanctions that does not wait for one
Warnings Treated as a product rather than a log line: a badge beside the avatar, a modal the account has to acknowledge, and a record of what was decided and when

Failing open is the expensive direction here, so an outage at the moderator fails the upload instead of waving it through.

The cursor.style chat in numbers

The one universities cite

AgroPost has run since 2010: a marketplace, company catalogue and grain-logistics board for Ukrainian agriculture, now with a US edition at agro-post.com. It is the least glamorous thing I operate and the one that ended up in other people's teaching materials.

Institution Where it appears Year
Odesa State Agrarian University Course work programme, listing AgroPost as a notice board, company catalogue and trading platform 2025
Mykolaiv National Agrarian University Methodical recommendations for crop production technology 2021
Mykolaiv National Agrarian University Technical crops teaching material 2016
National University of Food Technologies Conference proceedings, bibliography citing the elevators directory 2015

How it holds together

Browsers and extensions reach Cloudflare, which fronts a k3s cluster running Laravel, Node and workers over MySQL, MongoDB, Redis, Meilisearch and R2; GitHub Actions and Argo CD deliver it, AWS SSM and External Secrets configure it, Grafana watches it

Five public brands, one cluster, one operator. Nothing reaches production except through Git: Actions builds and pushes the image, Argo CD syncs the manifests, External Secrets pulls configuration out of AWS Parameter Store, and Cloudflare Zero Trust is the only door into the admin side. If it is not in a repository, it is not running.

Certifications


AWS DevOps Engineer
Professional

AWS Solutions Architect
Associate

AWS Cloud Practitioner
Foundational

Kubernetes & Cloud Native
Associate (KCNA)

GitOps Certified
Enterprise · Codefresh

GitOps Certified
Fundamentals · Codefresh

GitHub Actions
Certification Program

Microsoft MTA
Networking Fundamentals

Claude with Amazon Bedrock
Anthropic · September 2026

GitHub Copilot
Core Skills · March 2026

Azure DevOps to GitHub
Enterprise migrations · December 2025

Eleven in total. The last three are set in this page's own style, because the issuers publish no badge artwork for them.

Toolbox

Edge and delivery Cloudflare AWS Kubernetes Argo CD Docker Terraform GitHub Actions

Services and data PHP Laravel Node.js MySQL MongoDB Redis WebRTC

In the browser JavaScript TypeScript Chrome extensions Tailwind Three.js Python

On GitHub

30 public repositories, 342 contributions in the last twelve months, mostly JavaScript, PHP and HTML
A snake eating this year's contribution squares

Worth a look

Repository What it does
laravel-gsc-manager Google Search Console inside Laravel, authenticated with a service account
ai-php-json-files-language-translator Translates PHP, JSON and plain-text language files with an LLM, keeping placeholders intact
tabler-icons-font-picker Tabler icon picker with categories, search and a drop-in field
image-processing Image pipeline on AWS: ECS, Lambda, Aurora and S3
slither The multiplayer snake running at cursor.style/games
How this page builds itself

Nothing here is a screenshot, and no image is hand-placed pixel art.

  • assets/hero.svg is generated by tools/build_hero.py. GitHub serves README images under default-src 'none', so an SVG can never pull a web font down. Every piece of display type is therefore baked into <path> outlines from ASCII subsets of Baloo 2 and JetBrains Mono, kept in tools/fonts/ with their OFL licences. The mascot is embedded as a data URI for the same reason.
  • assets/traffic.svg is redrawn every night. update_readme.mjs asks the Cloudflare GraphQL API for yesterday and for the last 30 days, writes assets/traffic.json, and tools/build_traffic.py turns that into the chart above - bars, busiest-day marker, aligned figures and all.
  • assets/github.svg is the same idea pointed at the GitHub GraphQL API. The usual readme-stats services were answering 503 and 402 while this page was built, so the card is generated here instead and cannot go down on its own.
  • The numbers in the text come from the same run, so the readable version stays correct even if images are blocked.
  • The snake is redrawn from the contribution graph by a second workflow and published to the output branch.

Rebuild the artwork locally with:

pip install fonttools pillow
python tools/build_hero.py
python tools/build_traffic.py
GITHUB_TOKEN=... python tools/build_github_card.py

Say hello

LinkedIn Telegram cursor.style

Pinned Loading

  1. image-processing image-processing Public

    Scalable AWS image processing pipeline using ECS, Lambda, Aurora, S3, and EventBridge

    JavaScript

  2. simple-architecture simple-architecture Public

    This repository contains CloudFormation templates and CI/CD pipeline configs for deploying a simple Node.js app on AWS

    JavaScript

  3. ecs-onetime-parser ecs-onetime-parser Public

    CI/CD flow: github - ECR - ECS - CloudWatch + Lambda

    JavaScript

  4. notes-app-sam notes-app-sam Public

    Serverless Notes API on AWS with Cognito Authentication

    JavaScript