A modern, responsive web application for managing and tracking your comic book collection with advanced analytics, financial tracking, and comprehensive organization features. Built with React 18, TypeScript, and Tailwind CSS.
Live Demo: comics.banast.as
Perfect for comic collectors who want to:
- π Track their entire collection digitally
- π Analyze collection value and performance
- π Search and filter comics easily
- π± Access their collection on any device
- π Monitor financial gains/losses
- π·οΈ Organize with custom tags and storage locations
Get your own comic collection manager running in under 5 minutes:
# 1. Clone this repository
git clone https://github.com/yourusername/comics.banast.as.git
cd comics.banast.as
# 2. Install dependencies
npm install
# 3. Start the development server
npm run dev
# 4. Open your browser to http://localhost:5173That's it! You now have your own personal comic collection manager running locally.
- Features
- Technology Stack
- Installation
- Usage
- Project Structure
- Data Management
- Development
- Performance
- Browser Support
- Contributing
- License
- Comprehensive Comic Details: Track title, series, issue number, release date, grade, purchase price, current value, cover artist, storage location, tags, notes, and more
- Cover Art Display: Visual representation of your collection with cover image support and graceful fallbacks
- Condition Tracking: Distinguish between raw and slabbed comics with dedicated views
- Signature Tracking: Record signed comics and who signed them
- Variant & Graphic Novel Support: Track variant covers and graphic novels separately
- Storage Organization: Virtual storage locations and box management
- Dashboard Overview: Total comics, collection value, average grade, and performance metrics at a glance
- Financial Tracking: Purchase vs current value comparison with gain/loss calculations
- Performance Analytics: Biggest gainers/losers and value trends over time
- Condition Breakdown: Raw vs slabbed comic statistics with clickable navigation
- Series Analytics: Drill down into your collection by series with detailed breakdowns
- Artist & Tag Views: Browse collections by cover artist or custom tags
- Storage Analytics: Track comics by storage location with summary statistics
- Smart Search: Find comics by title, series, notes, cover artist, and more
- Flexible Views: Switch between grid and list layouts for optimal browsing
- Advanced Sorting: Sort by title, series, issue, grade, value, date, and more
- Interactive Detail Pages: Click any comic, series, tag, artist, or storage location for detailed views
- Clickable Dashboard Cards: All statistics cards navigate to their respective detail pages
- Series Navigation: Series boxes throughout the app are clickable for easy navigation
- Mobile-First: Optimized for all screen sizes from 320px to 4K displays
- Touch-Friendly: Minimum 44px touch targets for mobile accessibility
- Fluid Typography: Text scales appropriately across all devices
- Cross-Platform: Works seamlessly on desktop, tablet, and mobile devices
- CSV Import: Built-in CSV to JSON converter for easy data import
- File Upload Interface: Drag-and-drop file upload with validation
- Data Export: Export your collection data for backup or migration
- Validation: Comprehensive data validation with Zod schemas
- Frontend: React 18 + TypeScript
- Build Tool: Vite with optimized code splitting
- Styling: Tailwind CSS with custom responsive utilities
- State Management: Zustand (modern) + Custom React hooks (legacy)
- Icons: Lucide React
- Validation: Zod schemas for data validation
- Performance: Lazy loading, code splitting, responsive images
Before you begin, make sure you have:
- Node.js 18 or higher - Download here
- Git - Download here
- A modern web browser (Chrome, Firefox, Safari, or Edge)
-
Clone the repository:
git clone https://github.com/yourusername/comics.banast.as.git cd comics.banast.as -
Install dependencies:
npm install
-
Start the development server:
npm run dev
-
Open your browser and go to
http://localhost:5173
-
Follow steps 1-2 above, then:
-
Build for production:
npm run build
-
Preview the production build locally:
npm run preview
-
Deploy the
distfolder to your web hosting service (Netlify, Vercel, GitHub Pages, etc.)
The app comes with sample data, but you'll want to add your own comics. Here's how:
-
Prepare your data in a CSV file with these columns:
title,seriesName,issueNumber,releaseDate,coverImageUrl,coverArtist,grade,purchasePrice,purchaseDate,currentValue,notes,signedBy,storageLocation,tags,isSlabbed,isVariant,isGraphicNovel -
Access the converter by clicking the file upload icon in the app header
-
Upload your CSV and download the converted JSON file
-
Replace
src/data/comics.jsonwith your new file -
Restart the development server to see your collection
-
Open
src/data/comics.jsonin a text editor -
Replace the content with your comic data using this format:
[ { "id": "unique-id-1", "title": "The Amazing Spider-Man", "seriesName": "The Amazing Spider-Man", "issueNumber": 1, "releaseDate": "1963-03-01", "coverImageUrl": "https://example.com/cover.jpg", "coverArtist": "Steve Ditko", "grade": 4.0, "purchasePrice": 15000, "purchaseDate": "2024-01-15", "currentValue": 18500, "notes": "First appearance of Spider-Man", "signedBy": "", "storageLocation": "Box A-1", "tags": ["key issue", "first appearance", "marvel"], "isSlabbed": true, "isVariant": false, "isGraphicNovel": false, "createdAt": "2024-01-15T10:30:00Z", "updatedAt": "2024-01-15T10:30:00Z" } ]
If you want to see how the app works before adding your own data, the repository includes:
example-comic-collection.json- A sample collection with 15 comicssrc/data/comics.json- The current active collection data
- Open the app in your browser at
http://localhost:5173 - Explore the Dashboard - See your collection statistics at a glance
- Browse your comics - Switch between grid and list views
- Search and filter - Use the search bar and sorting options
- Click anything - Comics, series, artists, tags, and storage locations are all clickable
- Total collection value and number of comics
- Biggest gainers/losers in your collection
- Condition breakdown (raw vs slabbed)
- Series analytics - see which series you collect most
- Search by title, series, artist, or notes
- Filter by grade, value range, or tags
- Sort by any field (title, value, date, etc.)
- Quick filters for slabbed comics, variants, and graphic novels
- Works on any device - phone, tablet, or desktop
- Touch-friendly - optimized for mobile browsing
- Responsive images - covers look great on any screen
Want to share your collection online or access it from anywhere? Here are the easiest options:
- Build your project:
npm run build - Go to netlify.com and sign up
- Drag and drop your
distfolder to deploy - Get a free URL like
your-collection.netlify.app
- Connect your GitHub repo to vercel.com
- Vercel auto-deploys when you push changes
- Get a free URL like
your-collection.vercel.app
- Build your project:
npm run build - Push the
distfolder to agh-pagesbranch - Enable GitHub Pages in your repo settings
- Get a free URL like
yourusername.github.io/comics.banast.as
- Upload the contents of the
distfolder to any web hosting service - The app works as a static website - no server required!
src/
βββ components/ # React components
β βββ Dashboard.tsx # Main statistics dashboard
β βββ ComicCard.tsx # Grid view comic cards
β βββ ComicDetail.tsx # Individual comic detail page
β βββ ComicForm.tsx # Add/edit comic form
β βββ SeriesDetail.tsx # Series-specific views
β βββ CoverArtistDetail.tsx # Artist-specific views
β βββ TagDetail.tsx # Tag-specific views
β βββ StorageLocationDetail.tsx # Storage views
β βββ lazyComponents.ts # Centralized lazy loading
β βββ ErrorBoundary.tsx # Error handling
β βββ ResponsiveImage.tsx # Optimized image component
βββ stores/
β βββ comicStore.ts # Zustand state management
βββ hooks/
β βββ useComics.ts # Legacy data management
β βββ useComicFilters.ts # Filtering and sorting
β βββ usePerformance.ts # Performance monitoring
βββ types/
β βββ Comic.ts # TypeScript interfaces
βββ utils/
β βββ storage.ts # Storage utilities
β βββ performance.ts # Performance utilities
β βββ validation.ts # Data validation
βββ data/
β βββ comics.json # Comic collection data
βββ styles/
βββ responsive.css # Additional responsive styles
- Primary Storage:
src/data/comics.json- Main comic collection data - Format: JSON array of Comic objects
- Schema: Defined in
src/types/Comic.tswith Zod validation - Backup: Export functionality for data backup and migration
The project uses a hybrid approach during transition:
- Modern (Preferred): Zustand store in
src/stores/comicStore.ts - Legacy: React hooks in
src/hooks/useComics.ts
Note: When making changes, prefer the Zustand store approach as it's the target architecture.
- Prepare CSV with required columns (see usage section)
- Access Converter via file icon in header
- Upload CSV file for validation and conversion
- Download JSON file with converted data
- Replace existing
comics.jsonfile
# Development
npm run dev # Start development server with hot reload
npm run build # Build for production
npm run preview # Preview production build
npm run lint # Lint code
# Additional development commands
npm run dev:debug # Start with debugging enabled
npm run analyze # Analyze bundle size- Core Layout:
App.tsx,Dashboard.tsxfor main structure - Display Components:
ComicCard.tsx,ComicListView.tsxfor collection views - Detail Views: Lazy-loaded components for individual item details
- Utility Components:
ErrorBoundary.tsx,ResponsiveImage.tsxfor shared functionality
- Data Loading: JSON data loaded on app startup
- State Management: Zustand store manages centralized state
- Component Subscription: Components subscribe to specific store slices
- Filtering/Sorting: Handled by
useComicFiltershook - Performance: Monitored via
usePerformancehook
- Use TypeScript for all new components
- Implement lazy loading for detail views
- Follow mobile-first responsive design
- Add error boundaries for component isolation
- Use Zustand store for new state management
- Implement proper loading states and fallbacks
- Code Splitting: Lazy-loaded detail pages reduce initial bundle size
- Image Optimization: Responsive images with WebP support and fallbacks
- Bundle Optimization: Separate chunks for vendors, utilities, and components
- Performance Monitoring: Built-in utilities for tracking performance metrics
- Memory Management: Efficient state management with Zustand
- JavaScript Bundle: <250KB gzipped
- CSS Bundle: <50KB gzipped
- Images: WebP format with lazy loading
- Fonts: Subset and preload critical fonts
- Lazy Loading: Detail views load on demand
- Skeleton Screens: Smooth loading experience
- Progressive Enhancement: Core functionality works without JavaScript
- Error Boundaries: Graceful error handling
- Chrome 90+ β
- Firefox 88+ β
- Safari 14+ β
- Edge 90+ β
- iOS Safari 14+ β
- Chrome Mobile 90+ β
- Samsung Internet 13+ β
- Firefox Mobile 88+ β
- WCAG AA Compliant: Proper contrast ratios and semantic HTML
- Keyboard Navigation: Full keyboard accessibility
- Screen Reader Support: ARIA labels and live regions
- Touch Accessibility: Minimum 44x44px touch targets
The project is transitioning from React hooks to Zustand:
- Current: Mixed approach with both systems
- Target: Full Zustand implementation
- Migration: Gradual component-by-component migration
- Flexible Schema: Easy addition of new comic properties
- Backward Compatibility: Maintains support for existing data
- Validation: Comprehensive Zod schemas prevent data corruption
- Data Storage: Uses JSON file instead of database (easily upgradeable)
- Single User: No authentication or multi-user support currently
- Image Hosting: Cover images must be hosted externally
- Manual Backup: No automated backup or sync features
- Complete Zustand Migration: Finish state management transition
- Enhanced Testing: Comprehensive test suite implementation
- PWA Features: Offline functionality and app installation
- Advanced Filtering: More sophisticated search and filter options
- Database Integration: Migration to PostgreSQL/Supabase
- User Authentication: Multi-user support with personal collections
- Image Upload: Direct cover image upload and hosting
- Mobile App: Native mobile application
- Cloud Sync: Cross-device synchronization
- Community Features: Collection sharing and social features
- Make sure you have Node.js 18+ installed
- Try clearing npm cache:
npm cache clean --force - Delete node_modules and package-lock.json, then run
npm installagain
- Check your JSON syntax - use a JSON validator
- Make sure all required fields are present in each comic object
- Restart the development server after changing data files
- Use HTTPS URLs for cover images when possible
- Check that image URLs are accessible from your browser
- Consider using a free image hosting service like Imgur or Cloudinary
- Check for TypeScript errors:
npm run lint - Make sure all imports are correct
- Verify your data structure matches the expected format
- Check the Issues for common problems
- Create a new issue if you can't find a solution
- Include error messages and steps to reproduce the problem
We'd love your help making this app better! Here's how to contribute:
- Report bugs - Found something broken? Let us know!
- Suggest features - Have an idea? We'd love to hear it!
- Improve documentation - Help others by improving this README
- Fork the repository and clone it locally
- Create a feature branch:
git checkout -b your-feature-name - Make your changes and test them
- Submit a pull request with a clear description
- Bug fixes and performance improvements
- New features that help comic collectors
- Better mobile experience and accessibility
- Documentation improvements and examples
- Use TypeScript for all new code
- Follow the existing code style
- Test your changes before submitting
- Write clear commit messages
Yes! This is completely free and open source. You can use it for personal or commercial purposes.
Not at all! The app is designed to be user-friendly. You just need to:
- Install Node.js (one-time setup)
- Run a few commands
- Add your comic data
Yes! Once you've built the app, it runs entirely in your browser. No internet connection needed after the initial setup.
Unlimited! The app can handle collections of any size, from a few comics to thousands.
Your data stays on your computer unless you choose to deploy it online. The app uses local JSON files, so you have complete control.
Yes! Your data is stored in src/data/comics.json - just copy this file to backup your collection.
Great! This is open source, so you can modify it however you want. Or submit a feature request and we might add it!
This project is licensed under the MIT License - see the LICENSE file for details.
Need help? Here's where to get it:
- π Found a bug? Create an issue
- π‘ Have a feature idea? Start a discussion
- π Need help with setup? Check the troubleshooting section above
- π¬ Want to chat? Join our community discussions
- Star this repository β to show your support
- Fork it to create your own copy
- Follow the Quick Start guide above
- Start tracking your collection!
Happy collecting! π¦ΈββοΈπ
