About this project

Why this project exists

This project was created for three main reasons:

  1. My first project using agentic AI. This is my first time building a real-world product end-to-end by myself, using agentic AI tools alongside all of my web development knowledge. The goal was to go beyond tutorials and side experiments — to ship something complete, with authentication, a database, email flows, and a polished UI. A production-grade application built from scratch.
  2. Svelte is the framework I know best. I chose Svelte not because it's trendy, but because it's the framework I'm most comfortable with. I wanted to build something real and full-featured using the tools I understand deeply. Svelte 5's runes mode ($state, $derived, $effect), SvelteKit's file-based routing, and the clean separation between client and server make it an excellent choice for this kind of project.
  3. It is possible to use React libraries inside Svelte. A technical bonus: this project demonstrates that it's entirely possible to embed a React component — even a complex one like Excalidraw — inside a Svelte application. By initializing the React component within a Svelte 5 $effect() (via the @attach directive), we bridge the two frameworks seamlessly. React becomes just another rendering target, while Svelte handles everything else.

The result? A working Excalidraw clone with auth, database persistence, and folder management — all powered by Svelte, with React living quietly inside a single component.

Tech Stack

LayerTechnology
FrontendSvelte 5 (runes mode)
Full-stack frameworkSvelteKit
BackendSvelteKit server actions + load functions
AuthBetter Auth (email/password + GitHub OAuth)
EmailResend (verification, password reset)
ORMDrizzle ORM
DatabasePostgreSQL 18
DB RuntimeDocker Compose (local development)
React component@excalidraw/excalidraw
React bridgereact + react-dom (initialized inside $effect())
LanguageTypeScript (strict mode)
Package managerBun
Linting/FormattingESLint + Prettier