How kadir.gulec.tr works
A hand-drawn digital notebook: what I write, watch and aim for — in Turkish.Ein handgezeichnetes digitales Notizbuch: was ich schreibe, schaue und mir vornehme — auf Türkisch.
Why a second site
This blog is static on purpose: a portfolio is content, and content needs no database. kadir.gulec.tr is the opposite case. It is my personal site in Turkish, my first language, and readers do things on it — they sign up, follow a goal, comment on a post, get notified. That needs accounts, permissions and a queue, so it is a Laravel application.
The idea is a notebook rather than a website: one place for what I write, what I watch and what I am working towards, kept honestly — the goals I miss stay on the page, crossed out in pencil.

A notebook, not a template
Each section has its own colour and its own paper object. Films are polaroids, long-term goals are cards pinned to a cork board, a finished goal gets a rubber stamp. Headlines are set in a serif, notes in handwriting, numbers in a mono face. The desk lamp in the corner switches to the night notebook.

Films and series
What I watch is logged with a rating out of ten, an optional review and, for series, the season and episode I am on. Reviews can hide spoilers behind a marker stroke that a click lifts. Posters come from TMDB, and a watchlist ("Sırada") keeps what is next in order.

Goals on three floors
The goals page zooms out as you scroll. At the top are habit chains — "don't break the chain" — drawn as hand-drawn links. A chain counts days, weeks or months: "twice a week" fills one link per week once two days are marked, and an excused day, sick or travelling, is a link patched with tape instead of a break. Below come this year's goals with progress bars, and at the bottom the long-term goals on a cork board.

Every goal is public, censored or hidden. A censored goal keeps its numbers and its shape, but its words never leave the server: the browser only learns how long the title is and draws the marker stroke to that length. Close friends with the right role read the real text; a hidden goal does not exist for anyone but me.

Following along
Readers can create an account and follow a film, a goal or a project. When something happens — a 30-day streak, a milestone, a new review — they get one digest e-mail at the pace they choose: right away, daily or weekly. Each item in it carries its own unfollow link.
The site is also an installable web app. Signed-in readers can switch on push notifications per device, and every e-mail then arrives as a notification as well. Signing out on a device ends its notifications.

The back office
Everything is written and maintained in a Livewire admin panel I call the back office. The dashboard opens on today: one tap marks each habit as done or excused, a weekly chain shows how the week stands, and numeric goals take a +1 with a note.

A chain's page holds its settings and the whole year as a clickable grid. For weekly and monthly chains, the server works out each morning whether the remaining days still leave room: once the days left are at most twice the times still needed, I get a reminder by e-mail and push.

Posts and project write-ups use a Markdown editor with a toolbar, a short syntax guide and a preview rendered with the site's own stylesheet. It knows the notebook's extras: highlighter, side notes in the margin, polaroid images and spoilers.

The rest of the back office covers members, roles and permissions, comment moderation, contact messages and backups that can be downloaded and restored.
Stack notes
Laravel 13 with Livewire 4 for the admin panel and the interactive parts of the
site, Alpine.js for small in-page behaviour, Tailwind CSS 4, MariaDB. Sign-in
uses Fortify with passkeys or two-factor codes, which the admin panel requires.
Share images are drawn with GD in the notebook style on first request. Push
notifications use the Web Push standard with VAPID keys, through
minishlink/web-push.
The test suite is Pest with 376 tests, alongside PHPStan and Pint. Every
push to master runs them in GitHub Actions and, when they pass, deploys to a
HestiaCP server. That server has no process supervisor, so the queue is drained
by the scheduler every minute.
The light-theme homepage screenshots come from the live site; the others show sample data from the development seeder.