[{"content":"As development gets faster thanks to new approaches and AI, there’s more time to be not only a developer but a bit of a designer—to ship interfaces that feel pleasant, not just functional. But whenever I think about design, I freeze up.\nSo I asked the best designer I know—@TheFairyOfTheInnerGoose: is there a “quick way” to grasp design? A handful of rules to make things decent without endless courses or a new career?\nHe boiled it down to two principles: visual hierarchy and the principle of similarity.\nVisual hierarchy This is about priorities. There’s always something a person should see first, then second, then third. There can’t be multiple “first priorities”: if everything is important, nothing is important. Hierarchy comes from size, color, contrast, spacing, and placement. Ideally, the user gets one clear entry point and a logical path for the eye to follow.\nPrinciple of similarity This is about grouping. Elements that are related by meaning should sit closer to each other than to the rest. In text, letters are closer together than words, and lines are farther apart than words, so the eye doesn’t get lost. Interfaces work the same way: a card sits farther from screen edges than its inner content; a heading is closer to its description than to the photo; cards within one block are closer to each other than to the edges. That’s how you build sensible groups of elements.\nA formula that sticks Hierarchy is meaning expressed through size, color, and the rhythm of spacing. Related things—bring them closer. Unrelated things—separate them. Important things—highlight them. That’s enough to build tidy, effective interfaces even while staying primarily a developer.\nBonus: a playlist of short videos on visual hierarchy and similarity — https://youtube.com/playlist?list=PLB-qPpAk87uJOZ8WZ_39b0uRQybZgDRPc, plus a set of “academic” UX principles — https://lawsofux.com/.\nP.S. need more serious design help? Ping @TheFairyOfTheInnerGoose, he’s got you 🙂‍↕️\n","permalink":"https://chenchik.me/posts/design-as-developer/","summary":"Two anchors for developers doing design: visual hierarchy and similarity to build readable interfaces without switching careers.","title":"Design as a developer"},{"content":"About two years ago I found a dead simple recipe for Russian pancakes (blini). They’re thin, stretchy, and perfect for wrapping jam. I never thought I’d write about cooking here, but I make these on a lot of slow weekends, so it’s nice to keep the details somewhere I can find them.\nWhy this recipe stuck I always have the ingredients. The batter takes maybe five minutes. Even a regular Saturday feels a little special when the kitchen smells like hot butter. Ingredients 2 large (or 3 medium) eggs 1/3 tsp fine salt 2–3 tbsp sugar plus 1 tsp vanilla sugar 3 tbsp neutral oil for the batter, plus a thin layer for the pan 150 g all-purpose flour 500 g milk at room temperature I stick to grams so the batter behaves the same every time.\nStep-by-step ritual Whisk eggs, salt, both sugars, and 3 tbsp oil until the sugar is gone. Add the flour and mix it in before any milk hits the bowl. Pour in the milk in three rounds while whisking so the batter stays smooth. Let it sit for 15–20 minutes. This keeps the pancakes soft instead of rubbery. Heat a non-stick pan, oil it once, and cook quick thin pancakes—about 45 seconds on the first side and 15 on the second. Serving ideas Roll them with your favorite jam—currant, strawberry, apricot, whatever is open in the fridge. Slice fresh berries right on top and finish with a drizzle of condensed milk for dessert-level comfort. Melted butter dunk I melt a big chunk of salted butter in a tiny saucepan. Each pancake gets folded into a triangle and dunked into that pool. Eat, dunk, repeat until the butter is pretty much gone.\nIf you prefer a visual reference, the original video walkthrough is right here: That’s the whole ritual. Simple batter, short rest, lots of butter. If you try it, tell me what you put inside the pancakes.\n","permalink":"https://chenchik.me/posts/weekend-russian-pancake-ritual/","summary":"How I make the thin Russian pancakes that turned into a weekend tradition and the exact steps, toppings, and butter dunk I rely on.","title":"My Weekend Russian Pancake (Blini) Ritual"},{"content":"This continues the minimal Dokku server story — I’m building myself a tiny app platform.\nWhy bother with a database Backends for mobile projects exist to process data off-device, so even the “minimal” backend must store data reliably; otherwise keeping a server online makes no sense. Before another side project, I set up the persistent layer first, then deploy new apps.\nWhat I picked Options were SQLite (each service has its own file), several PostgreSQL instances, or one shared instance. I like SQLite, but file management is annoying and I want minimal configuration. So I went with the simplest manageable setup:\nOne PostgreSQL on the server: least maintenance; if it dies, all services die, but on a single VPS that’s acceptable. One database for all projects: saves memory and CPU slots; separation lives in tables. Backups: via the Dokku plugin to external storage out of the box. Create the database Install the PostgreSQL Dokku plugin once:\nsudo dokku plugin:install https://github.com/dokku/dokku-postgres.git Then create a single shared database (service name db) and use separate tables/schemas per project:\ndokku postgres:create db Bun app example On the server:\ndokku apps:create fruits dokku certs:add testapp \u0026lt; chenchik.tar dokku postgres:link db fruits Reminder: the certificate line is from the previous post; it enables HTTPS. Alternatively, you can use letsencrypt like in the original guide.\nWhen you link the DB to an app, Dokku adds DATABASE_URL, which lets the app connect. Locally I assemble a minimal Bun API, mainly because Bun ships with postgres support. The example is intentionally compact.\nCreate a folder with two files.\nserver.ts:\nimport { serve } from \u0026#34;bun\u0026#34;; import postgres from \u0026#34;postgres\u0026#34;; const sql = postgres(process.env.DATABASE_URL!); let seeded = false; async function ensureSeededOnce() { if (seeded) return; await sql`CREATE TABLE IF NOT EXISTS items (name TEXT PRIMARY KEY)`; await sql` INSERT INTO items (name) VALUES (\u0026#39;apple\u0026#39;), (\u0026#39;another-apple\u0026#39;), (\u0026#39;banana\u0026#39;), (\u0026#39;carrot\u0026#39;) ON CONFLICT DO NOTHING `; seeded = true; } serve({ port: 80, async fetch(req) { const url = new URL(req.url); const filter = url.searchParams.get(\u0026#34;filter\u0026#34;) ?? \u0026#34;\u0026#34;; await ensureSeededOnce(); const rows = await sql\u0026lt;{ name: string }[]\u0026gt;` SELECT name FROM items WHERE name ILIKE ${\u0026#34;%\u0026#34; + filter + \u0026#34;%\u0026#34;} `; return new Response(JSON.stringify(rows), { status: 200, headers: { \u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34; }, }); }, }); Dockerfile:\nFROM oven/bun:alpine WORKDIR /app COPY server.ts . EXPOSE 80 CMD [\u0026#34;bun\u0026#34;, \u0026#34;server.ts\u0026#34;] Deploy to Dokku from the folder with these two files:\ngit init . git remote add dokku dokku@\u0026lt;ip\u0026gt;:fruits git add server.ts Dockerfile git commit -m \u0026#34;fruits api\u0026#34; git push --set-upstream dokku main Check: https://fruits.chenchik.me/?filter=app — it works!\nSet up backups to Cloudflare R2 Data is too easy to lose, so I set up backups once and forget about them. The plugin ships with postgres:backup, which can send dumps to an AWS S3-compatible bucket. Many providers offer this; the ones I use are Hetzner and Cloudflare. Hetzner has a minimum monthly cost; Cloudflare R2 instead gives 10 GB free, which is plenty for these DBs. If I ever need more, I’ll probably reconfigure the server anyway. To configure backups to R2 I need a few parameters: key, secret, and endpoint (region and signature version are for AWS proper, not relevant here).\nAuthorize R2:\ndokku postgres:backup-auth db \\ \u0026lt;R2_ACCESS_KEY\u0026gt; \\ \u0026lt;R2_SECRET_KEY\u0026gt; \\ us-east-1 \\ s3v4 \\ \u0026lt;R2_ENDPOINT\u0026gt; You can grab these in the Cloudflare dashboard, Build \u0026gt; Storage \u0026amp; Databases \u0026gt; R2 object storage. On the right, open API Tokens -\u0026gt; Manage. R2_ENDPOINT is a full URL—copy it entirely.\nThen I create a bucket in R2 (say, db-backups) and add a schedule on the server for 0 3 * * * — daily at 3 a.m.:\ndokku postgres:backup-schedule db \u0026#34;0 3 * * *\u0026#34; db-backups Manual one-off check:\ndokku postgres:backup db db-backups This stores a logical pg_dump in R2; to restore, download the dump and load it back into db.\nTakeaways The simplest possible persistence layer with an automatic backup.\n","permalink":"https://chenchik.me/posts/persistent-layer-pet-projects/","summary":"One PostgreSQL on Dokku plus Cloudflare R2 backups — my baseline persistence for mobile apps.","title":"Adding a persistence layer for side projects"},{"content":"This is a follow-up to the minimal Dokku server story. I pulled this part out so the original guide stays focused, and we can keep iterating on the same Hello World backend.\nThe helloworld app already runs in production; the server is alive and well. Now I want extra headroom for performance and security, so I’m placing Cloudflare between users and the VPS. It’s free, adds caching and HTTP/2, and filters most junk traffic before it ever touches Dokku.\nPrerequisites a registered domain you can transfer into Cloudflare; a Cloudflare account; a server with Dokku and the helloworld app; access to Hetzner Firewall (or your provider’s firewall) so only Cloudflare IPs can reach the box. Step-by-step 1. Move the domain to Cloudflare First, give Cloudflare control over DNS. It’s one of the fastest and most reliable DNS platforms, and the base plan is free, so the transfer itself is already an upgrade. In the dashboard I create a new zone and follow the wizard. Every registrar has its own flow, so Cloudflare keeps the official instructions here: https://developers.cloudflare.com/registrar/get-started/transfer-domain-to-cloudflare/ Once the NS records are updated, wait until Cloudflare verifies the zone.\n2. Turn on the proxy The zone already contains A-records pointing to my Hetzner IP. By default Cloudflare only answers DNS queries (grey cloud). I need the full proxy, so I switch the helloworld record to the orange cloud (Proxied). Now all HTTP/HTTPS traffic flows through Cloudflare and the free edge certificates kick in automatically. At this point the app is already available at https://helloworld.chenchik.me.\n3. Issue an Origin Certificate This setup works, but managing Let’s Encrypt certificates becomes painful, especially with several apps—Brian explains the issue well: https://bitkidd.dev/posts/use-cloudflare-ssl-certificates-with-dokku To avoid rate limits and keep public certificates away from the private network, I issue an Origin Certificate instead. It secures the connection between Cloudflare and the server for up to 15 years. In the dashboard I go to SSL/TLS → Origin Server, click “Create Certificate,” and save the private key and certificate as pet.key and pet.crt.\n4. Install the certificate in Dokku Move the files to the server and plug them into Dokku.\nSSH into the box: ssh root@\u0026lt;ip\u0026gt;.\nCreate files with the certificate and key (nano pet.crt, nano pet.key) and paste the Cloudflare data.\nPackage them, disable the old certificate, and add the new one:\ntar -cvf pet.tar pet.crt pet.key dokku letsencrypt:disable helloworld dokku certs:add helloworld \u0026lt; pet.tar dokku ps:rebuild helloworld certs:add replaces the certificate, and ps:rebuild restarts the app with the updated TLS settings. Cloudflare terminates TLS at the edge and keeps TLS all the way to the server, so the whole chain is encrypted.\nOnce everything works, I remove the Let’s Encrypt plugin to keep Dokku clean:\nsudo dokku plugin:uninstall letsencrypt 5. Lock the server with a firewall Anyone can still bypass Cloudflare and hit the server directly. To prevent that, I enable Firewall in Hetzner Cloud and allow inbound 80/443 traffic only from Cloudflare IP ranges: https://www.cloudflare.com/ips/ SSH stays limited to my own addresses. Now the server “sees” the internet exclusively through Cloudflare. Catalin walks through the same setup for Hetzner + Cloudflare: https://catalins.tech/selfhost-with-dokku-hetzner-cloudflare/\nFinal checks Confirm that the certificate is in use:\ncurl -I https://helloworld.chenchik.me server: cloudflare and cf-cache-status: DYNAMIC tell me the proxy is in front. Direct requests to the IP already fail on ports 80/443 because the firewall blocks them.\nThe whole rollout takes about 30–60 minutes. In return you get more performance from caching, free HTTPS, and a shield from random spikes. Next up: adding more features to these little pet projects.\nSources https://bitkidd.dev/posts/use-cloudflare-ssl-certificates-with-dokku https://spiffy.tech/dokku-with-lets-encrypt-behind-cloudflare https://catalins.tech/selfhost-with-dokku-hetzner-cloudflare/ https://developers.cloudflare.com/registrar/get-started/transfer-domain-to-cloudflare/ ","permalink":"https://chenchik.me/posts/cloudflare-shield/","summary":"Hide a Dokku app behind Cloudflare: move the domain, turn on the proxy, issue an origin certificate, and block direct traffic with a firewall.","title":"Cloudflare proxy for my Dokku server"},{"content":"This post is part of a tiny backend platform series:\nMinimal Dokku Setup for Side Projects Cloudflare proxy for my Dokku server Adding a persistence layer for side projects Why This Is Hard Every now and then I get back to tinkering with side projects. As a mobile developer I just need the tiniest backend: return some JSON, write a couple of rows to a database, run a simple bit of logic. Nothing heroic. But the moment I open the first Google result and try to follow the “standard” approach, the supposed basic backend turns into a quest.\nUsual Options I genuinely like Cloudflare Workers, but their SDK immediately dictates an edge architecture. Minimal containers on DigitalOcean quickly turn into a noticeable bill, and Fly.io (plus similar platforms) comes with its own constraints. There is also Coolify: it converts your server into a mini-cloud and covers plenty of corner cases, but you pay for that with the complexity of the solution itself. You need a beefy server, so the infrastructure cost climbs again and suddenly looks like something for a small business, not a Sunday experiment.\nI Want Minimalism I want something so cheap I can forget about it for a year; without quirky limits so any quick-start guide from the internet works as-is; and flexible enough to wrap a backend without thinking about the stack—Python today, JavaScript tomorrow, Swift the day after. Adding another half-dead project shouldn’t bump the bill or break the setup: services should just run side by side without drama.\nThe Sweet Spot: Hetzner + Dokku + Dockerfile Hetzner/VPS: low-cost, reliable, and always on. Containers: the Dockerfile abstracts the stack, so Python, JavaScript, and Swift deploy the same way. Dokku: a lightweight “manager” for containers on the box—configure once, spin up or update tiny apps with a couple of simple commands. Budget: roughly €5/month plus a domain (~€1.5/year) to get human-friendly URLs and enable HTTPS. Step-by-Step Here’s how I set up and use the Hetzner + Dokku + Dockerfile combo. It takes about an hour and leaves you with your own mini-cloud.\nRenting the VPS The provider doesn’t really matter—we just need a small Linux box with SSH access. I’ll show it with Hetzner because the price/performance ratio is excellent.\nBy the end of this step you should have:\na running Linux server a public IP address a password or SSH key so you can log in with ssh root@\u0026lt;ip\u0026gt; Hetzner Cloud server\nOpen the cloud console and create a project if you don’t have one already. Inside the project hit Create server and pick a plan. I use CX23 on x86. There’s also CAX11 on ARM—much faster for the same money—but not all software loves ARM, so for a “no-stress” setup I stay on x86. Location: I choose Germany, Falkenstein. Pick whatever region is closest to you (latency checker). OS: Ubuntu LTS has the most straightforward guides. If you crave minimalism and don’t mind googling a bit, grab Debian for slightly better efficiency. Networking: I add an IPv4 address (+€0.61/month for me) because my ISP still doesn’t do IPv6. You might be able to skip it. SSH: upload your public key (or create a new one) to log in without a password—it makes Dokku setup easier. Skip the remaining toggles (backup, extra disks). You can revisit them later. Hit Create \u0026amp; Buy now, wait for the server to boot, and confirm access via ssh root@\u0026lt;ip\u0026gt; -i ~/.ssh/hetzner (if SSH complains about permissions, run chmod 600 ~/.ssh/hetzner). Expect to pay around €3.5–4.5/month for this configuration.\nDomain Setup I buy the cheapest domain I can find—zones like .xyz usually cost €1–2/year—and configure DNS right at the registrar. If they don’t provide DNS, I hook up free Cloudflare DNS.\nOpen the domain management panel. Create a wildcard record *.chenchik.me (A/AAAA) pointing to the server’s IP. Now every subdomain such as helloworld.chenchik.me resolves to my VPS.\nInstalling Dokku The rest of the commands happen on the server: ssh root@\u0026lt;ip\u0026gt; -i ~/.ssh/hetzner.\n(Optional) update the system: # Ubuntu update all sudo -s -- \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; apt-get update apt-get upgrade -y apt-get full-upgrade -y apt-get autoremove -y apt-get autoclean -y EOF I usually reboot afterward (sudo reboot) and reconnect. Install Dokku. Latest version at the time of writing is 0.36.10, so I pull the official script and pin the tag: wget -NP . https://dokku.com/install/v0.36.10/bootstrap.sh sudo DOKKU_TAG=v0.36.10 bash bootstrap.sh Add an SSH key for deployments by reusing the key I already use for the server: cat ~/.ssh/authorized_keys | dokku ssh-keys:add admin Better yet, generate a dedicated key pair for deployments. If you have a public key elsewhere, just pass it directly: echo \u0026#39;\u0026lt;your-public-key\u0026gt;\u0026#39; | dokku ssh-keys:add admin Set the default domain: dokku domains:set-global \u0026lt;your-domain\u0026gt; Install the Let’s Encrypt plugin, wire up your email, and enable automatic renewals: sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git dokku letsencrypt:set --global email \u0026lt;your-email\u0026gt; sudo dokku letsencrypt:cron-job --add That’s it—Dokku is ready and we can move on to the first backend.\nFirst Backend Time to deploy something. The first two commands run on the server; everything else happens locally.\nCreate an app on the server: dokku apps:create helloworld Enable HTTPS: dokku letsencrypt:enable helloworld Locally, create an empty Git repo and point it at Dokku: git init helloworld cd helloworld git remote add dokku dokku@\u0026lt;ip\u0026gt;:helloworld Verify the connection (ssh -T dokku@\u0026lt;ip\u0026gt; should list commands). If it fails, add a snippet to ~/.ssh/config so SSH knows which key to use: Host \u0026lt;ip\u0026gt; IdentityFile ~/.ssh/hetzner AddKeysToAgent yes UseKeychain yes After creating the file, run chmod 600 ~/.ssh/config to fix permissions. Create a minimal backend: cat \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; \u0026gt; server.js const http = require(\u0026#39;http\u0026#39;); http.createServer((_, res) =\u0026gt; { res.writeHead(200, {\u0026#39;Content-Type\u0026#39;:\u0026#39;application/json\u0026#39;}); res.end(\u0026#39;{\u0026#34;message\u0026#34;:\u0026#34;hello world\u0026#34;}\u0026#39;); }).listen(80); EOF Add a tiny Dockerfile: cat \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; \u0026gt; Dockerfile FROM node:24-alpine COPY server.js . EXPOSE 80 CMD [\u0026#34;node\u0026#34;, \u0026#34;server.js\u0026#34;] EOF Commit and deploy. As soon as git push reaches the server, Dokku builds the image and restarts the app: git add -A \u0026amp;\u0026amp; git commit -m \u0026#34;first backend\u0026#34; git push --set-upstream dokku main Done! The app now lives at https://helloworld.chenchik.me\nSources https://catalins.tech/selfhost-with-dokku-hetzner-cloudflare/ https://dokku.com/docs/getting-started/installation/ ","permalink":"https://chenchik.me/posts/minimal-dokku-setup/","summary":"My minimal stack for mobile side projects: a low-cost Hetzner VPS, Docker containers, and Dokku without infrastructure headaches.","title":"Minimal Dokku Setup for Side Projects"},{"content":"From time to time each one of us can make a mistake, and more often than not this happens so quickly that before we realize the mistake, we take an erroneous action based on this assessment. This can lead to conflict, and it can have serious consequences if such decisions are made about the future, finances, or business.\nUncomfortable, right? So why can\u0026rsquo;t we stay 100% rational?\nWhat\u0026rsquo;s in our heads? It turns out that our brains are a very complex processing center, processing large amounts of data from our senses. And evolution has optimized this center to respond to inputs with as little delay as possible in order to keep us alive in a critical situation and not miss out on the benefits that will help us thrive in the future.\nBecause of that, our thinking system chooses the easiest way to assess the situation and draw conclusions based on the information it has. It\u0026rsquo;s very difficult to realize that we don\u0026rsquo;t have enough data to evaluate situations, it\u0026rsquo;s much easier to just draw a conclusion.\nIntuition is not 100% accurate In simple terms the thought process looks like this:\nCollecting data Finding the simplest heuristic to assess the situation based on the data found Using the heuristic and getting an answer The set of heuristics that are \u0026ldquo;stored\u0026rdquo; in our head can be called \u0026ldquo;intuition\u0026rdquo;, they are optimized for a very fast and simplified answer, they work instantly. In case we have expertiese in some field: we have a wider catalog of heuristics with a larger set of input parameters.\nAnd here comes the first possibility to make a mistake - the simplest heuristic may not be statistically more correct than any other, but given the architecture of the brain, even those who know statistics quite well are not immune to such an error.\nHidden substitution What if the search for heuristics fails? At that point, our brains will begin to substitute the question we are trying to answer in order to search for the heuristic again. For example:\nInstead of: will I make a profit buying stocks of this company? We ask ourselves: do I like this company? Of course this will lead us to an error.\nSlow Thinking is our friend In case we couldn\u0026rsquo;t find an answer, processing shifts from the intuitive block to the more complex and slower block of deep thinking, where we can have a dialogue in our head and assess the situation in more complex scenarios that have more steps.\nWhat to do? Given the systematic nature of the algorithm, we can identify the main \u0026ldquo;simplifying heuristics\u0026rdquo; (or cognitive biases), notice them in our own/others\u0026rsquo; actions and thoughts, and prevent ourselves from making final decisions based on them.\nThis text is based on the wonderfully interesting book Daniel Kahneman. THINKING, FAST AND SLOW, which I recommend everyone read.\n","permalink":"https://chenchik.me/posts/why-cognitive-bias/","summary":"In this post I’m trying to understand why our brain’s shortcuts and intuition often override logic—and how noticing these patterns can help you make better decisions in everyday life.","title":"Why aren't we 100% rational?"},{"content":"I started this project as a way if learning Swift and it has since grown into a fully fledged app. I have learned many skills through this and been I’m very proud of having this in my portfolio. If you don’t have a project as awesome as this I would advise you to make one.\n","permalink":"https://chenchik.me/posts/simply-receipts/","summary":"\u003cp\u003eI started this project as a way if learning Swift and it has since grown into a fully fledged app. I have learned many skills through this and been I’m very proud of having this in my portfolio. If you don’t have a project as awesome as this I would advise you to make one.\u003c/p\u003e","title":"Simply Receipts"},{"content":"Привет!\nI have over 7 years in mobile apps as a product lead and 3 years as a developer. During my career, I went the whole way from a support specialist, though a frontend developer, project and product lead and have chosen to grow as Swift Developer. I think the Swift ecosystem is the best one right now and have all chances to become significant in all fields (not just mobile) due to the constant evolution of the language and LLVM.\nI believe that the only way to truly overcome a challenge is to build a deep understanding of the systems around it and then build your solution on top of that. That is why in my work I\u0026rsquo;m practising a holistic approach, and system thinking and constantly growing my knowledge in multiple disciplines like Mobile, Deep Learning, Backend, DevOps, etc.\nAlways looking forward to working and learning from dynamic teams, tackling hard challenges with lots of data, and complex and snappy UIs to deliver business value to customers.\nWhat I do\nMobile using Swift with UIKit, SwiftUI, CoreData, CloudKit : Simply Receipts Web using TypeScript with React and Nextjs: enableOps website Backend using Python with FastAPI, Strawberry GraphQL, Postgres and Reddis: enableOps api DevOps using Kubernetes with Pulumi, ArgoCD and GitHub Actions: local GitOps \u0026amp; IaaC Skills\nCritical thinking and problem solving: if you have a problem I will provide a working solution Can manage the full cycle of software development: have prior experience as team leader of a team 25 ppl Businesses analysis: have prior experience as a product manager and data analyst Fun facts\nThe one who walk the walk: did 400km of Camino de Santiago in 2022, starting from Leon Run 2021km in 2021, follow me on Strava! Love to travel and do long bike rides Born in imaginary land: Transnistria Sometimes I write blog and tweet thoughts. Feel free to reach me on LinkedIn to talk about jobs.\nLooking for my CV? Get PDF or view on GitHub!\n","permalink":"https://chenchik.me/about/","summary":"\u003cp\u003e\u003cstrong\u003eПривет!\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eI have over 7 years in mobile apps as a product lead and 3 years as a developer. During my career, I went the whole way from a support specialist, though a frontend developer, project and product lead and have chosen to grow as Swift Developer. I think the Swift ecosystem is the best one right now and have all chances to become significant in all fields (not just mobile) due to the constant evolution of the language and LLVM.\u003c/p\u003e","title":"Who am I?"}]