Skip to content
Kadir Gülec — HomeStartseite
All workAlle Projekte
LIVELIVE EN

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.

STACKSTACK Laravel 13 · Livewire 4 · Alpine.js · Tailwind CSS · MariaDBLaravel 13 · Livewire 4 · Alpine.js · Tailwind CSS · MariaDB
ROLEROLLE Solo — concept, design, backend, deploymentAlleine — Konzept, Design, Backend, Deployment
kadir.gulec.tr The site itself is in Turkish.Die Seite selbst ist 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.

kadir.gulec.tr homepage: a paper notebook with coloured section tabs on the right, a hand-drawn logo and the latest film and post pinned with tape
The homepage: every section is a coloured tab on the side of the notebook.

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.

The same homepage in the dark night-notebook theme
The night notebook, switched on with the desk lamp.

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.

Films and series page with polaroid posters, red rating circles and progress bars for the series being watched
Recent films as polaroids, series with their progress.

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.

Habit chain cards with streak counters, one counted in weeks, and a censored chain whose title is blacked out
Daily and weekly chains. The blacked-out one is censored.

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.

Cork board with long-term goals on pinned cards, one of them censored with black marker
Long-term goals on the cork board, each linked to the smaller goals that serve it.

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 homepage on a phone with the section tabs as a bottom navigation bar
On a phone the tabs become a bottom bar; the site installs like an app.

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.

Admin dashboard with today's habits, Done and Excuse buttons, a weekly chain badge and numeric goals with +1 buttons
The dashboard: today's habits and goals, one tap each.

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.

Chain editor set to three times a week, with a year grid of done, excused and empty days
A weekly chain: three times a week, the year as a grid.

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.

Project editor with a Markdown case study, technology tags and cover upload
Editing a project's case study.

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.

ResultsTreffer ()

No results foundKeine Treffer

Nothing matchedNichts gefunden für “”.

Type at least 2 characters to start searching.Mindestens 2 Zeichen eingeben, um zu suchen.

ESC to closeschließen ENTER to selectauswählen

Searching…Suche läuft…

Powered byAngetrieben von Pagefind