Gian Canevari

Full Stack Developer · Copenhagen

Gian Canevari

I build full-stack web applications end-to-end — from database schema to deployed UI. My work ships with tests, handles edge cases, and stays fast.

Projects

Production-deployed. Click any project to see the case study.

ShowFreak — Streaming Tracker screenshot

TypeScript

ShowFreak — Streaming Tracker

Full-stack streaming tracker with a custom genre-weighted recommendation engine, JWT refresh token rotation, and 106 automated tests — deployed on Vercel + Render + Neon.

Case study

Every streaming tracker I tried surfaced the same trending content regardless of what I actually watched. ShowFreak fixes that with a recommendation engine that weights genres from your rated content (5★=3pts, 4★=2pts, 3★=1pt) — the more you rate, the more accurate it gets.

The key architectural decision was local content caching: all TMDB metadata is stored in a local content_cache table on first fetch, so library queries and sorting never hit the external API. This eliminated the N+1 problem at the API boundary and made the library fast regardless of TMDB's response time.

JWT auth uses refresh token rotation — every token refresh issues a new refresh token and invalidates the old one, so a stolen token becomes useless after one use. The full test suite covers 81 backend integration tests and 25 frontend unit tests, giving me confidence to refactor without regressions.

I built ShowFreak using AI-assisted development throughout — starting with Kilo Code for architecture and scaffolding, then switching to Claude Code for debugging, refactoring, and feature delivery. This workflow cut implementation time significantly and is now how I approach every project.

Stack: React 18 + TypeScript · Node.js 20 + Express · PostgreSQL 16 + Prisma · TanStack Query · Vitest · Vercel + Render + Neon

Frello — Kanban Board screenshot

JavaScript

Frello — Kanban Board

Full-stack Trello clone with a 15-route REST API, multi-level drag-and-drop, and a guest-to-account migration that preserves all board state — deployed on Vercel + Render.

Case study

I built Frello to understand how Trello actually works under the hood — not just the UI, but the data model and API that makes complex board state consistent across sessions.

The most interesting engineering challenge was guest mode. I wanted users to try the app without signing up, but losing your boards on registration would kill conversion. The solution: boards created in guest mode persist in localStorage; on account creation, the app migrates the entire board structure to the server without any visible interruption.

The REST API covers boards, lists, cards, labels, comments, priorities, due dates, and reusable templates — 15 routes total, validated with Joi. Drag-and-drop works across all entity levels: you can reorder boards, reorder lists within a board, and move cards between lists. Express 5 on the backend with Sequelize 6 ORM and PostgreSQL.

Stack: React 19 · React Router 7 · Node.js + Express 5 · PostgreSQL + Sequelize 6 · JWT Auth · Vite · Vercel + Render

DrumPad & Metronome screenshot

TypeScript

DrumPad & Metronome

Browser-based drum sequencer with a look-ahead beat scheduler and per-key audio pools to eliminate playback artifacts under rapid input — React 19 + TypeScript + Web Audio API.

Case study

This started as a curiosity about the Web Audio API and became a study in browser timing constraints and performance engineering.

The first problem: rapid repeated hits on the same pad cut off the previous sound. A single HTMLAudioElement per pad can only play one instance at a time. I pre-created a pool of 3 HTMLAudioElements per key at mount, cycling round-robin so rapid inputs overlap correctly without artifacts.

The second problem: a naïve setTimeout-based metronome drifts badly under JavaScript's single-threaded event loop. I implemented a look-ahead scheduler — the same technique used by Tone.js — that schedules Web Audio API events 25ms ahead of playback time, decoupling the scheduler from the main thread and eliminating audible drift at any BPM.

Recording captures millisecond-accurate timestamps; replay drives a setTimeout chain with a ref-based abort flag so playback can be cancelled mid-sequence. All five custom hooks (useAudioPool, useRecording, useRecordingHistory, usePlayback, useMetronome) are independently unit-tested. Full keyboard accessibility with ARIA labels and prefers-reduced-motion support.

Stack: React 19 · TypeScript · Vite · Web Audio API · Vitest + Testing Library · GitHub Pages

Experience

May 2025 – Present

Copenhagen, Denmark

Freelance Web Developer

Self-employed
  • Building and maintaining web projects with custom backend logic, APIs, and structured content systems
  • Managing full deployment lifecycle — version control, CI/CD, and Vercel hosting
  • Working across the full stack: React frontends, Node.js APIs, and PostgreSQL databases

Jan 2026 – Mar 2026

Copenhagen, Denmark

AI-Powered SEO Intern

Copenhagen, Denmark
  • Built AI-assisted content workflows using Make.com, structured datasets, and CMS integrations
  • Designed repeatable automation pipelines combining prompt engineering with structured data
  • Tested and refined LLM outputs iteratively to improve reliability and consistency

2023 – 2024

Berlin, Germany

Python Developer Bootcamp

Berlin Technological Academy
  • Python, Django REST Framework, SQL, Git/GitHub, and Docker fundamentals
  • Transitioned from industrial engineering into software development

2015 – 2020

Chile

Bachelor's in Industrial Engineering

Universidad Adolfo Ibáñez
  • Systems thinking, analytical problem-solving, and operational decision-making
  • Foundation in structured reasoning that carries directly into software architecture

About

Full-stack developer based in Copenhagen. I transitioned into software engineering through a Python bootcamp in Berlin after a degree in industrial engineering, and have since built four production-deployed applications across the full stack — REST APIs, relational databases, React frontends, and this portfolio itself. Currently doing freelance web development and recently completed an AI automation internship working with Make.com and Claude Code.

Across those projects I've shipped JWT refresh token rotation, a genre-weighted recommendation engine, multi-level drag-and-drop with a 15-route REST API, and a Web Audio API look-ahead scheduler — backed by 106 automated tests. My engineering background means I think in systems before I write code.

Available now for full-stack and frontend roles, remote or on-site in Copenhagen. TypeScript across the full stack, Python with Django when the work calls for it. I speak English (C1), Spanish (native), Italian, and conversational Danish.

Frontend

TypeScriptReactNext.jsReact RouterTanStack QueryTailwind CSSHTMLCSS

Backend

Node.jsExpressPythonDjango RESTREST APIsJWT AuthPrismaSequelize

Database

PostgreSQLMySQLSQL

AI & Automation

Make.comClaude CodePrompt EngineeringAI Workflows

Testing

VitestTesting LibraryIntegration Testing

Tools

GitGitHubDockerCI/CDVercelRenderAzure / AWS

Get in touch

Available now for full-stack and frontend roles — remote or on-site in Copenhagen.

EU citizen with Danish residence permit. No sponsorship required.