Journal Application
Image representing Journal Application

Journal Application

Nikola Filipovski
Image of author Nikola Filipovski

Nikola Filipovski

Full-Stack Web Developer

Visit Project

Overview

Journal is a personal blog platform where the author can write, manage, and publish journal entries. The public side is designed to feel like a literary magazine, refined, readable, intentional. The admin side is a fully custom CMS built specifically for long-form writing.

Tech Stack

Layer Technology
FrameworkNext.js (App Router)
LanguageTypeScript
StylingTailwind CSS + CSS custom properties
DatabasePostgreSQL
ORMDrizzle ORM
AuthenticationSession-based auth
Media StorageCloudinary
HostingVercel
Preview image of journal app landing page

Design System

The visual identity is built around an editorial dark theme, the kind you'd find in a literary journal or independent publication.

  • Typography: Playfair Display for headings, Source Serif 4 for body text, both chosen for their literary character
  • Color palette:
    • #0f0f0f deep black background
    • #7eb8d4 steel blue headings
    • #c0504a dark red links
  • Design tokens defined as CSS custom properties and extended into Tailwind - no magic numbers scattered through the codebase
  • Fully responsive, accessible - skip links, ARIA attributes, keyboard navigation throughout

Public Blog

The reader-facing side of the application:

  • Homepage with a featured latest entry, recent posts, a monthly mood indicator, and a daily rotating quote pulled from an external API
  • Blog listing - all published entries, newest first
  • Individual post pages - full typography treatment with drop cap first letter, prev/next navigation between entries
  • Search - full-text search across titles, excerpts, content and tags, with a live dropdown in the header (debounced, keyboard navigable)
  • 404 and error pages - written in the same voice as the rest of the blog, with graceful fallbacks

Admin CMS

A completely custom content management system accessible only to the author:

  • Post listing - table view of all posts including drafts, with edit and live preview links
  • Post editor - the centerpiece of the admin panel; a full markdown editor with three view modes: Write, Split (side-by-side live preview), and Preview
  • Rich toolbar - text formatting (bold, italic, headings, blockquote, links) and media insertion (image, video, audio)
  • Media uploads - drag and drop or file picker for images, video, and audio stored on Cloudinary, with caption support
  • Voice recording - record audio directly in the browser via the MediaRecorder API, with live timer and playback before inserting
  • Draft/Published toggle, word count, reading time estimate, auto-generated URL slugs
  • Mood tracker - the author logs a daily mood note from the admin panel; entries are viewable by month with a full monthly breakdown, and the dominant mood for the current month is surfaced on the public homepage
Preview image of journal app Admin Dashboard page Preview image of custom created Admin New Entry/Edit Entry Markdown Content Editor

Authentication

Secure, authentication system:

  • Email and password login with session management
  • Sessions expire automatically and refresh on activity
  • Password management available from the admin panel
  • All admin routes fully protected, unauthenticated requests never reach any page or API endpoint

Database

PostgreSQL with Drizzle ORM, with a schema designed around clear relationships:

  • Posts with full metadata, slug, excerpt, content, tags, reading time, published status, and author
  • Mood entries linked to dates and months, with notes written by the author
  • Auth tables for secure session and account management
  • All database operations centralized in a typed query layer
  • Drizzle Studio available locally for direct database inspection

Media

All images, videos, and audio files are stored on Cloudinary - uploads go through the admin editor, are validated by type and size, and served via Cloudinary's CDN with automatic optimization. The free tier covers the storage and bandwidth needs of a personal blog comfortably.

API Layer

A set of internal REST endpoints that back the admin CMS and public features:

  • Post creation, update, and deletion
  • File upload handler integrated with Cloudinary
  • Search endpoint powering the live header dropdown
  • All authentication flows handled server-side

Hosting

The application is hosted on Vercel on the free tier. PostgreSQL is hosted on a managed cloud provider connected to Vercel via environment variables. Deployments are automatic on every push to the main branch. The free tier comfortably handles the traffic of a personal blog with no cold start issues thanks to Next.js edge runtime.

Documentation

The project includes full user documentation covering:

  • Writing guide - how to use the editor, markdown syntax, inserting media, saving drafts vs publishing
  • Mood tracker guide - how to log daily moods, add notes, and read the monthly breakdown
  • Maintenance guide - how to update dependencies, run database migrations, and monitor the application
  • Deployment guide - environment variables, Vercel configuration, Cloudinary setup
  • Extension guide - the codebase is structured to make adding new features straightforward; new pages, API routes, and database tables follow consistent patterns throughout

Other Details

  • PWA manifest - theme color, icons, and display mode configured for a native-app feel when added to a phone home screen
  • Daily quote - external API fetch with time-based revalidation, refreshes automatically without redeployment
  • Open Graph and Twitter Card metadata on all public pages for clean social sharing
  • Search engine directives configured per page - admin and error pages excluded from indexing

Visit the Journal app and see how a modern personal blog looks, featuring powerful search and a carefully crafted user experience: View the Journal App