A creative full stack developer portfolio by Catherine Arnado. Built to showcase interactive web experiences and creative work with modern tech
graph TD
A["User's Browser"] --> B["React Application"]
B --> C["Vite Dev Server / Build"]
B --> D["Components & Pages"]
D --> E["Tailwind CSS + UI Library"]
E --> F["Renders to DOM"]
F --> G["User Interactions"]
G --> H{API Call Needed?}
H -->|Yes| I["Express Server"]
H -->|No| F
I --> J["Route Handler"]
J --> K{Query DB?}
K -->|Yes| L["PostgreSQL + Drizzle"]
K -->|No| M["Send Response"]
L --> M
M --> N["JSON Response to Client"]
N --> B
B --> F
style A fill:#e1f5ff
style B fill:#f3e5f5
style I fill:#e8f5e9
style L fill:#fff3e0
erDiagram
USER ||--o{ PORTFOLIO : creates
USER ||--o{ JOURNAL : writes
USER ||--o{ EXPERIENCE : has
USER ||--o{ CERTIFICATION : earns
USER ||--o{ PROJECT : showcases
PORTFOLIO {
int id PK
int user_id FK
string title
text description
string image_url
timestamp created_at
}
JOURNAL {
int id PK
int user_id FK
string title
text content
string category
timestamp published_at
}
EXPERIENCE {
int id PK
int user_id FK
string company
string position
text description
date start_date
date end_date
}
CERTIFICATION {
int id PK
int user_id FK
string title
string issuer
date issued_date
string credential_url
}
PROJECT {
int id PK
int user_id FK
string name
text description
string tech_stack
string github_url
string demo_url
}
USER {
int id PK
string name
string email
text bio
string avatar_url
timestamp created_at
}
- Overview
- Features
- Tech Stack
- Project Structure
- Quick Start
- Development
- Building & Deployment
- Environment Setup
- Database Management
- Scripts & Commands
- Deployment Guide
- Contributing
This is katto.jsx - a full-stack portfolio application for Catherine Arnado. It's built to showcase creative work and interactive web experiences using React, TypeScript, Tailwind CSS, and Express.js. The project includes 3D elements, smooth animations, and a modern component library.
- Interactive Hero Section
- Visual Portfolio with project showcase
- Experience & Certifications display
- Digital Journal for blog content
- Travel Tours for Cebu & Bohol with day-by-day experiences
- Bento Grid Layout for flexible component arrangement
- Card Swap Interactions with smooth transitions
- 3D Elements using Three.js and React Three Fiber
- Laser Flow Effects with custom animations
- Fully Responsive design across all devices
- Dark Mode Support with theme provider
- Accessible Components using shadcn/ui
- PostgreSQL Database with Drizzle ORM
- Static File Serving for optimized assets
- File Storage and management
- Production Ready for Vercel deployment
- React 18+
- TypeScript
- Vite 7+
- Tailwind CSS + PostCSS
- shadcn/ui with Radix UI
- Three.js, React Three Fiber, Rapier Physics
- React Hook Form + Zod
- TanStack React Query
- Framer Motion
- Sonner (Toast), Recharts (Charts)
- Node.js 20
- Express.js
- TypeScript
- PostgreSQL
- Drizzle Kit
- tsx, esbuild
- Vitest for testing
- ESLint and TypeScript strict mode
- npm
- Vercel for hosting
- Git for version control
- Drizzle Kit for migrations
katto.jsx/
├── client/ # React frontend application
│ ├── index.html # Entry HTML file
│ ├── public/
│ │ └── assets/ # Static images & media
│ │ ├── backanim/ # Background animations
│ │ ├── cebubohol/ # Travel content (Cebu & Bohol)
│ │ ├── certificates/ # Certification images
│ │ ├── journals/ # Journal images
│ │ ├── logos/ # Brand logos
│ │ ├── merch/ # Merchandise assets
│ │ ├── projects/ # Project showcase images
│ │ └── sfx/ # Sound effects
│ └── src/
│ ├── main.tsx # React entry point
│ ├── App.tsx # Root component
│ ├── index.css # Global styles
│ ├── components/
│ │ ├── layout/ # Header, navbar, footer
│ │ ├── sections/ # Page sections (Hero, Experience, etc)
│ │ ├── ui/ # Reusable UI components
│ │ ├── LaserFlow.tsx # Custom animated effects
│ │ └── theme-provider.tsx # Dark mode context
│ ├── pages/ # Page components
│ ├── hooks/ # Custom React hooks
│ └── lib/ # Utilities and helpers
│
├── server/ # Express.js backend
│ ├── index.ts # Server entry point
│ ├── routes.ts # API route definitions
│ ├── static.ts # Static file middleware
│ ├── storage.ts # File storage logic
│ └── vite.ts # Vite middleware integration
│
├── shared/ # Shared code between client & server
│ └── schema.ts # Database schema (Drizzle)
│
├── script/ # Build scripts
│ └── build.ts # Custom build configuration
│
├── dist/ # Build output (generated)
│ ├── index.cjs # Bundled server
│ └── public/ # Built React app
│
├── migrations/ # Database migrations (generated)
│
├── Configuration Files
│ ├── vite.config.ts # Vite build configuration
│ ├── tsconfig.json # TypeScript configuration
│ ├── tailwind.config.ts # Tailwind CSS setup
│ ├── drizzle.config.ts # Database configuration
│ ├── vercel.json # Vercel deployment config
│ ├── .replit # Replit environment config
│ ├── components.json # shadcn/ui configuration
│ └── postcss.config.js # PostCSS plugins
│
└── Root Files
├── package.json # Dependencies & scripts
├── DEPLOYMENT.md # Deployment documentation
└── README.md # This file
graph TD
A["Browser Load"] --> B["Vite Dev Server / Production Build"]
B --> C["React App Initialization"]
C --> D["Load Components"]
D --> E["Layout"]
D --> F["Pages"]
D --> G["Sections"]
D --> H["UI Components"]
E --> I["Apply Styling"]
F --> I
G --> I
H --> I
I --> J["Tailwind CSS + Custom CSS"]
J --> K["Render to DOM"]
K --> L["User Interactions"]
L --> M{API Needed?}
M -->|Yes| N["Fetch from Server"]
M -->|No| K
N --> O["Update State"]
O --> K
style A fill:#e1f5ff
style C fill:#f3e5f5
style K fill:#e8f5e9
graph TD
A["Client API Request"] --> B["Express Server"]
B --> C["Route Handler"]
C --> D{Request Type?}
D -->|Static File| E["Serve from Disk"]
D -->|API Call| F["Process Logic"]
D -->|Not Found| G["Return 404"]
F --> H{Query DB?}
H -->|Yes| I["Drizzle ORM"]
H -->|No| J["Send Response"]
I --> K["PostgreSQL Query"]
K --> L["Return Data"]
L --> J
E --> J
J --> M["Format JSON Response"]
M --> N["Send to Client"]
N --> O["Client Renders"]
style B fill:#e8f5e9
style K fill:#fff3e0
style O fill:#f3e5f5
graph TD
A["Development"] --> B["Run: npm run dev"]
B --> C["Vite watches files"]
C --> D["Hot Module Replacement"]
D --> E["Browser auto-refresh"]
F["Production Build"] --> G["Run: npm run build"]
G --> H["Vite bundles React"]
H --> I["Output: dist/public/"]
G --> J["tsx bundles server"]
J --> K["Output: dist/index.cjs"]
I --> L["Git push to GitHub"]
K --> L
L --> M["Vercel detects push"]
M --> N["Run build command"]
N --> O["Deploy to CDN"]
O --> P["Live on Vercel"]
style B fill:#e1f5ff
style E fill:#e8f5e9
style G fill:#fff3e0
style P fill:#f3e5f5
- Node.js v20 or higher
- npm v10 or higher
- PostgreSQL (optional for local development)
- Git
-
Clone the repository
git clone https://github.com/yourusername/katto.jsx.git cd katto.jsx -
Install dependencies
npm install
-
Setup environment variables (optional for basic development)
cp .env.example .env.local # Edit .env.local with your configuration -
Start development server
npm run dev
-
Open in browser
- Client: http://localhost:5000
- Server: http://localhost:3000
Start the Vite dev server with hot module replacement:
npm run dev:clientFeatures:
- Fast refresh with HMR
- Clear error overlays
- Mobile preview support
- Component hot reloading
Run the full-stack development server:
npm run devThis starts:
- Express server on http://localhost:3000
- React client on http://localhost:5000
- Vite dev middleware for hot module replacement
Perform type checking:
npm run checkBuild the entire project for production:
npm run buildOutput structure:
dist/
├── index.cjs # Bundled Node.js server
└── public/ # Optimized React build
Run the bundled application locally:
npm startCreate a .env.local file in the project root:
NODE_ENV=developmentSet these in Vercel Project Settings > Environment Variables:
NODE_ENV=production
DATABASE_URL=postgresql://user:password@host:port/database
PORT=3000- REPLIT_INTERNAL_APP_DOMAIN - For Replit deployment
- REPLIT_DEV_DOMAIN - For Replit dev preview
- Custom API keys or service credentials
The project uses Drizzle ORM with PostgreSQL.
- PostgreSQL database provisioned
- Connection URL available as DATABASE_URL
Database schema is defined in shared/schema.ts
Generate and push schema changes:
npm run db:pushThis creates tables and applies migrations to your PostgreSQL database.
See drizzle.config.ts for database connection settings.
| Script | Purpose |
|---|---|
| npm run dev:client | Start Vite dev server (client only) |
| npm run dev | Start full-stack dev server |
| npm run build | Build for production |
| npm start | Run production build |
| npm run check | Type check with TypeScript |
| npm run db:push | Push database schema migrations |
-
Connect Repository
- Push to GitHub/GitLab
- Visit https://vercel.com
- Import your repository
-
Configure Environment Variables
- Project Settings > Environment Variables
- Add NODE_ENV=production
- Add DATABASE_URL=your_postgres_url
-
Deploy
- Vercel automatically builds on every push to main
- Build command: npm run build
- Output directory: dist
- Public directory: dist/public
-
Verify Deployment
# View logs vercel logs # Check deployment status # Dashboard: https://vercel.com/dashboard
dist/
├── index.cjs # Auto-detected by Vercel as serverless function
└── public/ # Static React app (served by CDN)
- Build logs: Vercel Dashboard > Deployments
- Runtime logs: vercel logs
- Environment variables: Verify in Project Settings
- Cold starts: Check Edge Function performance
See DEPLOYMENT.md for detailed deployment documentation.
- react - UI framework
- vite - Build tool
- typescript - Type safety
- tailwindcss - Styling
- @radix-ui/* - Accessible UI primitives
- react-hook-form - Form management
- @tanstack/react-query - Data fetching
- three - 3D graphics
- @react-three/fiber - React wrapper for Three.js
- @react-three/drei - Useful helpers for R3F
- @react-three/rapier - Physics engine
- express - Web server
- drizzle-orm - Type-safe ORM
- drizzle-kit - Database migrations
- tsx - TypeScript executor
- vite-plugin-runtime-error-modal - Error display
- cross-env - Cross-platform env vars
See package.json for complete dependency list.
The project uses a comprehensive UI component library built with shadcn/ui and Radix UI primitives:
- Buttons - Multiple variants and sizes
- Cards - Flexible layout components
- Dialogs & Modals - Alert dialogs, drawers, sheets
- Forms - Input groups, text areas, select dropdowns
- Navigation - Navbar, breadcrumbs, pagination
- Feedback - Toast notifications, progress bars, spinners
- Accessibility - Full ARIA support, keyboard navigation
Customization via components.json and Tailwind configuration.
Interactive day-by-day travel experiences with:
- Daily itineraries and photos
- Roommate showcase
- Location-based content organization
Custom animated background effects with:
- Particle systems
- Smooth animations
- Performance optimized
Modern, flexible grid system showcasing:
- Projects
- Skills
- Experiences
- Interactive cards
Fully responsive across all breakpoints with:
- Mobile-first approach
- Tablet optimization
- Desktop enhancement
- TypeScript strict mode for type safety
- Environment variables for sensitive data
- CORS and security headers configured
- Static asset optimization
- Code splitting and lazy loading
- Database query optimization with Drizzle
- Production bundle optimization
- DEPLOYMENT.md - Deployment documentation
- Vercel Docs - https://vercel.com/docs
- React Documentation - https://react.dev
- Vite Guide - https://vitejs.dev
- Tailwind CSS - https://tailwindcss.com
- shadcn/ui Components - https://ui.shadcn.com
- Drizzle ORM - https://orm.drizzle.team
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (git checkout -b feature/amazing-feature)
- Make your changes
- Commit with clear messages (git commit -m 'Add amazing feature')
- Push to the branch (git push origin feature/amazing-feature)
- Open a Pull Request
This project is licensed under the MIT License - see LICENSE file for details.
katto.jsx is a creative portfolio project by Catherine Arnado.
- Portfolio: https://katto.jsx/
- GitHub: github.com/yourprofile
- Email: contact@example.com
- shadcn/ui - Beautiful component library
- Radix UI - Accessible primitives
- Three.js - 3D graphics library
- Vercel - Hosting platform
- Tailwind CSS - Utility-first CSS
For issues, questions, or suggestions:
- Open an issue on GitHub
- Reach out via email
- Join discussions
Made with care by Catherine Arnado
If you find this project helpful, consider giving it a star!