Yalçıncan Ulus

> Full-stack engineer based in Türkiye.


selected work

// one-click guest logins available where applicable

01 Bitig Flow | Document Sharing & Analytics Platform

Full-stack document sharing app where teams share files through secure links and see how visitors read them. DocSend / Papermark alternative.

stack
TypeScript TanStack Start React Node.js TanStack DB PostgreSQL Drizzle ORM Redis S3 (Garage) Better Auth Docker
links
show details (8)
  • Write markdown in the app or upload PDFs and images, then share one document or a group of documents through a link
  • Each link has its own access rules: public, password, email, or email verified with a one-time code
  • Link analytics show visits, unique viewers, time spent on each page, how much of each PDF visitors read, and downloads
  • Team workspaces with owner, admin, and member roles, plus email invitations
  • Security features: hashed share passwords, rate limiting, file type checks on upload, and protected file delivery
  • One-click demo accounts that give each reviewer a private workspace, deleted automatically after 24 hours
  • Admin panel with two-factor authentication to control signups, demo access, and usage limits
  • Containerized with Docker Compose and deployed on Hetzner

02 Automated Price Tracking Platform

Full-stack price tracking app built as a Turborepo monorepo. Tracks grocery prices across 20+ sites and 10+ countries with time-series analytics and a public comparison frontend.

stack
TypeScript Turborepo Bun React PostgreSQL TimescaleDB Drizzle ORM Redis BullMQ Better Auth TanStack Router Playwright Docker Typesense (Elasticsearch/Algolia alternative) Sentry
links
show details (12)
  • Scrapes prices from 27+ grocery sites across 19 countries using Playwright (browser rendering) and Cheerio (fetch) strategies, selectable per site
  • TimescaleDB hypertables with time_bucket and time_bucket_gapfill queries for historical price trend charts
  • Daily EUR-based FX rates fetched via BullMQ workers; all prices normalized to EUR for cross-country comparison
  • Pack-size normalization via per-item factors and per-site price divisors for fair cross-market comparisons
  • Four apps in one monorepo: internal API + admin dashboard, and a public API + storefront for product price comparison
  • Recharts-powered line and bar charts on the public frontend for visualizing lowest price over time per country
  • Bull Board UI for monitoring and managing scheduled scraping and exchange rate jobs
  • Better Auth for admin authentication; public API is fully read-only with no auth required
  • Drizzle ORM for type-safe PostgreSQL queries; Redis for BullMQ job queues and API response caching
  • Full-text search with Typesense (Elasticsearch / Algolia alternative) on the admin dashboard
  • Sentry for error tracking and log monitoring
  • Containerized with Docker Compose

03 Social Media Platform

Full-stack social media app built as a Turborepo monorepo with a Bun backend and React frontend.

stack
TypeScript Turborepo Bun React PostgreSQL Drizzle ORM Redis S3 (minIO) Better Auth TanStack Router WebSockets Docker
links
show details (10)
  • Posts with image uploads via self-hosted MinIO S3, processed server-side with Sharp
  • Global and following feeds with cursor-based infinite scroll using TanStack Virtual
  • Real-time notifications delivered over WebSockets
  • Authentication via Better Auth with email/password, username, and guest login support
  • User profiles with follow/block system, bookmarks, likes, and comments
  • Admin dashboard with runtime system settings (toggle signups, guest login)
  • End-to-end type-safe tRPC-like API client; generated from the backend app type (elysiajs/eden)
  • Drizzle ORM for type-safe SQL with PostgreSQL
  • Redis caching for profiles, block lists, settings and session storage
  • Fully containerized with Docker Compose. Multi-stage builds using Turborepo prune

04 Messaging App

Real-time messaging application with JWT auth, friend system, and live WebSocket chat.

stack
TypeScript Node.js Express React Vite MongoDB Socket.IO Docker Bun
links
show details (7)
  • JWT authentication and protected route guards
  • Friend request system; find users by email, send/accept/reject requests
  • One-on-one conversations with cursor-based paginated message history
  • Real-time messaging via Socket.IO rooms
  • Originally Node.js, migrated to Bun runtime. Still a standard Express.js app
  • Integration tests with Bun test runner, Supertest, and mongodb-memory-server
  • Frontend built with TanStack Router, TanStack Query, React Hook Form + Zod, and shadcn/ui

05 Blog Platform

Blog platform with a REST API, public-facing blog, and an admin CMS. Three separate apps.

stack
TypeScript JavaScript Node.js Express React Vite MongoDB Docker
links
show details (5)
  • CRUD operations for blog posts and comments across three apps (API + CMS + public blog)
  • JWT authentication and role-based access control (admin/user)
  • Server settings to toggle comment creation and user signups at runtime
  • Both frontends built with React, TanStack Router, TanStack Query, and Zod
  • CI/CD pipeline with Docker and GitHub Actions for deployment

other projects

// more things I've built and contributed to

Multiplayer Location Guessing Game TypeScript Bun PostgreSQL Redis BullMQ D3.js Docker 2000+ games played

Multiplayer location guessing game played inside Discord. Hosts share a Google Maps link and a screenshot; players race to guess the country in chat.

  • Reads coordinates from all common Google Maps URL formats and finds the answer with Nominatim (OpenStreetMap) reverse geocoding
  • Guesses in plain chat with English and Turkish country names, ISO codes, and common aliases
  • Province mode for guessing Türkiye's 81 provinces by name or plate code, with separate stats
  • Point system with round and host multipliers that grow while a round stays unsolved
  • Leaderboards, player profiles, daily to yearly medals, and 30+ achievements
  • Map of wrong guesses drawn at the end of each round with d3-geo and canvas
  • PostgreSQL with Drizzle ORM for stats, Redis for live game state, and BullMQ for scheduled jobs
  • Admin tools for collusion review and a test mode that does not affect real stats
  • Compiled to a single Bun binary and deployed with Docker Compose
  • Over 2000 games played and 35.000+ guesses made by players