Memories from College
Late-night study sessions at Rutgers, friendships forged over shared textbooks, and the thrill of walking across campus on crisp autumn mornings.
Read the full story→As a frontend developer, implement the Navbar section for the Home page. Build a responsive navigation component using React with useState (mobileOpen, scrolled, activeLink), useRef (navRef), useScroll and useTransform from framer-motion to animate an SVG logo path (logoPathLength, logoOpacity) as the user scrolls. Implement an IntersectionObserver that maps data-nav-section attributes ('hero', 'story-scroll', 'gallery-preview', 'biography-snippet', 'stories-preview', 'album-showcase', 'photo-frame-showcase', 'cta') to active nav link states. Add a mobile hamburger menu with AnimatePresence and body scroll lock (document.body.style.overflow). Apply nb-root/nb-scrolled CSS class toggle on scroll past 20px. NAV_LINKS array includes Home, Gallery, Biography, Stories. Note: this component may already exist from a previous page and can be reused.
Create SQLAlchemy ORM models for all entities: Photo, Story, StoryPhoto (join table), Biography, TimelineEntry. Set up Alembic migrations directory and initial migration scripts to create all tables in MySQL/MariaDB. Define relationships (Story has many Photos via StoryPhoto). Include database session management (get_db dependency). Configure DATABASE_URL environment variable for MySQL/MariaDB connection. Provide seed data script with sample photos, stories, and biography content for Marielle Kowal so the frontend can render realistic content during development.
Bootstrap the FastAPI application structure: configure CORS middleware to allow frontend origin, set up APIRouter with /api prefix, implement global exception handlers (404, 422, 500), configure Pydantic response schemas for all models (PhotoResponse, StoryResponse, BiographyResponse, TimelineEntryResponse), set up environment variable management with python-dotenv, and add a health check endpoint GET /health. Structure: app/main.py, app/routers/, app/models/, app/schemas/, app/database.py. This is a prerequisite for all backend API endpoint tasks.
Set up the global design system for the React frontend: create a CSS custom properties file (or Tailwind config) with all brand colors from the SRD (primary: #4A90E2, primary_light: #A6C8F0, secondary: #E94E77, accent: #F5A623, highlight: #F8E71C, bg: #FFFFFF, surface: rgba(255,255,255,0.9), text: #333333, text_muted: #777777, border: rgba(0,0,0,0.1)). Set up global typography, spacing scale, and base component styles. Configure framer-motion as a shared dependency with shared spring presets used across section components. Set up shared CSS modules or global stylesheet for reusable animation classes (e.g., parallax, lightbox overlays). This is a prerequisite for all frontend section tasks.
As a frontend developer, implement the HomeHero section for the Home page. Build a multi-layer parallax hero using useScroll, useTransform, and useSpring from framer-motion. Background layer uses smoothBgScale (1→1.15) and smoothBgY (0→-80px), midground layer smoothMidY (0→-120px), and text layers headlineY, taglineY, ctaY with progressively faster parallax speeds to create depth separation. contentOpacity fades from 1 to 0.15 as user scrolls past 500px. Implement containerVariants with staggerChildren (0.15s) and delayChildren (0.2s), childUp (opacity+y slide) and childScale (opacity+scale) entrance variants. Add hh-bg-image, four hh-deco-frame decorative elements, handleScrollDown smooth scroll to next section, and data-nav-section='hero' attribute. Wrap in motion.section with initial opacity 0 animate to 1.
As a frontend developer, implement the HomeStoryScroll section for the Home page. Build a horizontally scrollable story card grid with four story objects (college, adventure, hometown, family), each with id, tag, tagClass, snapClass, title, snippet, image URL, and alt text. Implement a StoryCard sub-component using useRef and useInView (once: true, margin: '-60px') for scroll-triggered entrance animations: initial {opacity:0, y:40, scale:0.96} animating to {opacity:1, y:0, scale:1} with staggerDelay (index * 0.15s) and spring scale transition (stiffness:260, damping:20). Cards support whileHover ({scale:1.04, y:-6}) and whileTap ({scale:0.98}). Implement expandedId state with setExpandedId toggling hss-card-expanded CSS class via onClick. Each card renders hss-snap-line with story-specific color class and role='article' aria-label.
As a frontend developer, implement the HomeGalleryPreview section for the Home page. Build a 6-card photo preview grid using a PhotoCard sub-component. Each card object has id, caption, gradient (CSS linear-gradient string used as background), and alt text. PhotoCard uses local useState isActive toggled by onHoverStart/onHoverEnd and onTap (handleToggle). Active state animates the card with rotateY:6, rotateX:-4 spring (stiffness:260, damping:20). Use AnimatePresence for two conditionally rendered overlays: gp-card-frame (scale 1.15→1 entrance, opacity/scale exit) and gp-card-overlay with a gp-card-caption that slides in (y:12→0). Include a gp-card-shadow element. Card images use role='img' with aria-label from photo.alt. data-nav-section='gallery-preview' should be on the section wrapper.
As a frontend developer, implement the HomeBiographySnippet section for the Home page. Build a split-layout section with a parallax portrait and animated biography text. Implement a HighlightPhrase sub-component that uses useInView (once:false, margin:'-10% 0px -20% 0px') to animate backgroundColor between rgba(166,200,240,0.35) and transparent on scroll entry/exit. Use useScroll with target=sectionRef and offset=['start end','end start'] to drive portraitY (useTransform 40→-40px) and decoY (0→-60px) parallax transforms applied to hbs-portrait-wrap and hbs-deco-bg respectively. Render hbs-deco-bg with three hbs-deco-shape divs (speed 0.3), hbs-deco-mid with three hbs-deco-line divs (speed 0.5), and hbs-portrait-frame with whileInView scale 0.92→1 entrance animation. Include linkRef with useInView for animated CTA link. Add data-nav-section='biography-snippet'. Render an inline SVG silhouette as portrait placeholder.
As a frontend developer, implement the HomeStoriesPreview section for the Home page. Build an interactive story carousel/tabs UI with four story objects (day-in-life, travels, memories, garden), each containing id, tag, headline, excerpt, color hex, bgGrad (CSS gradient string), and shapes array (SVG circle definitions with cx, cy, r, fill). Implement useState for active story selection and useCallback for handlers. Each story panel renders an SVG background layer using the shapes array as animated circles. Use AnimatePresence for slide transitions between story panels. Display tag badge, headline, and excerpt text per story. Render navigation controls (prev/next or tab indicators) to switch between stories. Apply data-nav-section='stories-preview' to the section wrapper. Each story's bgGrad is applied as background to the panel container.
As a frontend developer, implement the HomeAlbumShowcase section for the Home page. Build a flip-book style photo album with 4 albumPages, each containing left and right photo objects (src URL, title, caption). Implement useState for currentPage (0) and direction using useCallback. Define flipVariants with enterFromRight (rotateY:-90), enterFromLeft (rotateY:90), center (rotateY:0), exitToLeft, exitToRight states and flipTransition (spring stiffness:200, damping:30, mass:1.2). Use AnimatePresence with custom direction prop to animate between pages. Implement captionVariants (hidden/visible/exit with opacity and y:12→0→-8) for caption transitions. Render prev/next navigation buttons, page indicator dots, and a two-column spread layout with left/right photo panels each showing image, title overlay, and caption text. Add data-nav-section='album-showcase' to the section.
As a frontend developer, implement the HomePhotoFrameShowcase section for the Home page. Build a vertical scroll-driven frame gallery with 4 FRAMES objects (frame-gold, frame-silver, frame-wood, frame-ornate), each having style class, quote, attribution, story text, gradient, parallaxSpeed (0.2–0.5), link href, and linkLabel. Implement a PhotoFrame sub-component that uses useScroll and useTransform on scrollYProgress ([0,1] → [0, -parallaxSpeed*120]) for per-frame y parallax at different speeds. Add initial {opacity:0, y:40} with whileInView entrance animation. Implement a FrameImage sub-component rendering a placeholder div with the frame's gradient background and an SVG image icon (rect + circle + polyline). Implement an onOpen modal/lightbox handler showing the full story, quote, attribution, and a link button. Use AnimatePresence for modal open/close transitions. Add data-nav-section='photo-frame-showcase'.
As a frontend developer, implement the HomeCTA section for the Home page. Build three MagneticButton sub-components for Gallery (/Gallery, Camera icon), Stories (/Stories, BookOpen icon), and Contact (/contact, Mail icon) links from lucide-react. Each MagneticButton uses useRef (btnRef), useState (hovered, particles array), useRef (particleIdRef), useMotionValue (mouseX, mouseY), and useTransform to map mouse position [-1,1] → [-6,6]px (textX) and [-4,4]px (textY) for magnetic text shift on hover. handleMouseMove computes normalized dx/dy from button center. handleClick spawns 12 particle elements with random angles, distances (40–100px), colorClasses (hc-particle--light/accent/secondary), scales, and durations, cleaned up after 800ms via setTimeout. Use AnimatePresence to render/exit particles. Buttons have whileHover scale:1.03 and whileTap scale:0.97 spring animations. Add data-nav-section='cta' to the section wrapper.
As a frontend developer, implement the Footer section for the Home page. Build a multi-column footer grid with brand column, quick links, explore links, and contact info. Implement QuickLinkItem sub-component using useState (hovered) with onHoverStart/onHoverEnd and an animated ftr-link-underline div that transitions width 0→'100%' (duration 0.25s easeInOut) on hover. Implement SocialIcon sub-component as motion.a with whileHover ({rotate:15, scale:1.2}) and whileTap ({scale:0.95}) spring animations (stiffness:400, damping:15). Footer component uses useState (toast) with handleCopy that calls navigator.clipboard.writeText and sets a toast message for 2 seconds. contactInfo array contains Mail, Phone (both copyable:true), and MapPin (copyable:false) entries from lucide-react. Render a decorative ftr-deco-bg with three ftr-deco-circle divs using CSS translateY scroll parallax (0.15x speed). Use AnimatePresence for toast notification entrance/exit. Note: this component may already exist from a previous page and can be reused.
Implement FastAPI backend endpoints for photo management: GET /api/photos (list all photos with pagination, filtering by category/tag), GET /api/photos/{id} (single photo detail with caption and metadata), GET /api/photos/featured (featured/homepage photos). Include Photo SQLAlchemy model with fields: id, src, title, caption, category, tags, display_order, is_featured, created_at. Return JSON responses compatible with HomeGalleryPreview, HomeAlbumShowcase, and HomePhotoFrameShowcase frontend sections. Note: frontend section tasks (HomeGalleryPreview, HomeAlbumShowcase, HomePhotoFrameShowcase) should depend on this task once implemented.
Implement FastAPI backend endpoints for stories: GET /api/stories (list all stories), GET /api/stories/{id} (single story detail with associated photos), GET /api/stories/featured (featured stories for homepage preview). Include Story SQLAlchemy model with fields: id, tag, headline, excerpt, content, bg_gradient, color_hex, display_order, is_featured, created_at. Return JSON responses compatible with HomeStoriesPreview and HomeStoryScroll frontend sections. Note: frontend section tasks (HomeStoriesPreview, HomeStoryScroll) should depend on this task once implemented.
Implement FastAPI backend endpoints for biographical content: GET /api/biography (full biography details), GET /api/biography/timeline (chronological timeline entries). Include Biography SQLAlchemy model with fields: id, title, subtitle, body_text, portrait_src, highlight_phrases (JSON array), created_at. Include TimelineEntry model with fields: id, year, event_title, event_description, display_order. Return JSON responses compatible with HomeBiographySnippet frontend section. Note: HomeBiographySnippet frontend task should depend on this task once implemented.
Set up static file serving and image storage for the backend: configure FastAPI StaticFiles mount for /media directory, implement POST /api/admin/photos/upload endpoint accepting multipart form data for image files, add image validation (file type, max size), store uploaded images in a persistent volume-mounted directory. Configure docker-compose volume for media storage persistence. Ensure high-resolution images are served efficiently per the non-functional requirement (gallery supports high-resolution images without compromising performance). Add image URL generation utility that returns absolute URLs based on the server host.
Set up a shared API client layer for the React frontend: create an axios or fetch-based API client configured with the backend base URL from environment variable (REACT_APP_API_URL or VITE_API_URL). Implement typed API functions for all resources: fetchPhotos(), fetchPhoto(id), fetchFeaturedPhotos(), fetchStories(), fetchStory(id), fetchFeaturedStories(), fetchBiography(), fetchTimeline(). Add React Query (or SWR) for data fetching, caching, and loading/error state management. Export shared TypeScript interfaces for Photo, Story, Biography, TimelineEntry response shapes. This enables all frontend section components to consume real backend data instead of hardcoded placeholders.

A curated collection of cherished photographs, heartfelt stories, and unforgettable moments from Monroe, New Jersey — celebrating a life beautifully lived.
From college halls to hometown streets, every chapter of Marielle's journey is a story worth telling.
Late-night study sessions at Rutgers, friendships forged over shared textbooks, and the thrill of walking across campus on crisp autumn mornings.
Read the full story→Road trips along the Jersey Shore, picking blueberries at local farms, and evenings spent watching sunsets paint the sky in shades of amber and rose.
Read the full story→Bike rides through tree-lined neighborhoods, Saturday morning farmers markets, and the comforting rhythm of a close-knit community.
Read the full story→The kitchen alive with laughter and the aroma of homemade pierogies, traditions passed down through generations of warmth and togetherness.
Read the full story→A collection of cherished photographs capturing the warmth, joy, and beauty of Marielle's life in Monroe, NJ.
Marielle Kowal grew up in Monroe, New Jersey, where the quiet charm of small-town life shaped her appreciation for the simple, meaningful moments that make a life extraordinary. From family gatherings on sun-dappled porches to community celebrations that brought neighbors together, her early years were woven with warmth and connection.
With a keen eye for beauty in everyday moments, Marielle documented decades of family milestones, seasonal traditions, and quiet afternoons through her ever-present camera. Her photographs capture not just faces and places, but the emotions and stories that bind generations together — laughter around the dinner table, the golden light of autumn walks, and the tender glances shared between loved ones.
This site is a tribute to her legacy — a living album of memories, stories, and the vibrant spirit that Marielle brought to every room she entered. Explore her world through the photos she cherished and the narratives that give them meaning.
Explore the moments, journeys, and memories that shaped Marielle's remarkable life in Monroe and beyond.
From early morning walks through the quiet streets of Monroe to evenings spent surrounded by family, every day held its own small wonders and cherished routines that made life extraordinary.
Read Story →Whether it was a weekend drive to the Jersey Shore or a cross-country trip out west, Marielle always carried a camera and a sense of wonder, capturing the beauty in every new horizon.
Read Story →Birthday celebrations, holiday gatherings, and quiet Sunday afternoons—these are the moments that defined Marielle's world. Each memory is a thread in the tapestry of a life well-lived.
Read Story →Marielle's garden was more than flowers and herbs—it was her sanctuary. Neighbors would stop by just to admire the roses, and she'd always send them home with a fresh bouquet.
Read Story →Browse through Marielle's cherished photo album — click the arrows or swipe to turn the page and discover the stories behind each image.
Each frame holds a story from Marielle's life — a cherished quote, a treasured photograph, a memory that shaped who she was.
"Every photograph holds a piece of time we can never get back."
Marielle Kowal
"The best stories are the ones we live, not the ones we plan."
From her journal, 1998
"Home is where the heart learns to be still."
Marielle, at her kitchen table
"We don't remember days, we remember moments."
A family favorite
Dive deeper into Marielle's world — browse the full photo gallery, read heartfelt stories from family and friends, or reach out to share your own memories.
No comments yet. Be the first!