Discover Masterpieces from the Art Institute of Chicago
A modern, interactive web application for exploring thousands of artworks from one of the world's premier art collections.
Features β’ Demo β’ Installation β’ API Documentation β’ Deployment β’ Contributing
- Overview
- Features
- Tech Stack
- API Documentation
- Installation
- Usage
- Project Structure
- Deployment
- Performance
- Roadmap
- Contributing
- License
- Acknowledgments
Art Explorer is a beautifully designed web application that brings the Art Institute of Chicago's extensive collection to your browser. Built with modern React and Vite, it offers an intuitive interface for discovering, searching, and curating your personal collection of masterpieces.
- β Interactive Gallery: Browse artworks by art movement with smooth animations
- β Unified Search: Search across artworks and artists simultaneously
- β Favorites System: Save and manage your favorite artworks locally
- β Immersive UI: 3D flip cards with full-screen image viewing
- β Responsive Design: Works seamlessly on desktop, tablet, and mobile
- β Production Ready: Optimized build with code splitting and performance enhancements
- π Live Deployment: Ready for deployment on Netlify/Vercel
- π¦ Optimized Build: Code splitting, minification, and asset optimization
- π¨ Modern UI: Glassmorphic design with dark theme and gold accents
- π Smart Search: Artist-aware search that enriches results
- πΎ Local Persistence: Favorites saved in browser localStorage
- π± Mobile First: Fully responsive and touch-friendly
Browse curated collections by art movement:
- Impressionism
- Post-Impressionism
- Surrealism
- Pop Art
- Renaissance
- Abstract Expressionism
- Cubism
- Modernism
- Art Deco
- Baroque
Our intelligent search performs parallel queries across:
- Artworks: Direct artwork title and metadata search
- Artists: Artist name search with automatic artwork expansion
- Smart Merging: Combines results, removes duplicates, and limits to 24 items
- Artist Highlighting: Shows which artists matched your search
- One-click favoriting with heart icon
- Persistent storage using browser localStorage
- Dedicated favorites view with toggle button
- Real-time favorite count badge
- Instant access to saved artworks
- 3D Flip Animation: Click to flip and see artwork details
- Full-Screen Modal: Expand images for detailed viewing
- Hover Effects: Smooth transitions and visual feedback
- Metadata Display: Artist, date, and medium information
- Glassmorphic Design: Frosted glass effects with backdrop blur
- Dark Theme: Easy on the eyes with gold accent colors
- Smooth Animations: CSS transitions and transforms
- Loading States: Elegant spinners and error handling
- Responsive Grid: Auto-adjusting layout for all screen sizes
- React 19.2.0 - Modern UI library with latest features
- Vite 7.2.4 - Lightning-fast build tool and dev server
- Lucide React - Beautiful, customizable icons
- ESLint 9 - Code linting and quality assurance
- Node.js 18+ - Runtime environment
- npm - Package management
- Custom CSS - Vanilla CSS with CSS variables
- Google Fonts - Inter (body) and Playfair Display (headings)
- CSS Grid & Flexbox - Modern layout techniques
- React Context API - Global favorites state
- React Hooks - useState, useEffect, useContext
- localStorage - Client-side persistence
Art Explorer leverages the Art Institute of Chicago's Public API to fetch artwork data and images. The API is free, open, and requires no authentication.
Artworks API: https://api.artic.edu/api/v1
Images API: https://lakeimagesweb.artic.edu/iiif/2
Endpoint: GET /api/v1/artworks/search
Purpose: Search for artworks by keyword, style, or artist name.
Query Parameters:
q(string, required) - Search query (style name, artwork title, or keyword)fields(string) - Comma-separated list of fields to returnlimit(number) - Number of results per page (default: 12)page(number) - Page number for paginationis_public_domain(boolean) - Filter to public domain artworks only
Example Request:
fetch(
`https://api.artic.edu/api/v1/artworks/search?q=Impressionism&fields=id,title,artist_display,date_display,medium_display,image_id&limit=12&is_public_domain=true`
)Response Structure:
{
"data": [
{
"id": 12345,
"title": "Artwork Title",
"artist_display": "Artist Name\nBirthβDeath",
"date_display": "1889",
"medium_display": "Oil on canvas",
"image_id": "abc123def456"
}
],
"pagination": {
"total": 100,
"limit": 12,
"offset": 0,
"total_pages": 9,
"current_page": 1
}
}Fields Used:
id- Unique artwork identifiertitle- Artwork titleartist_display- Formatted artist name with datesdate_display- Creation date or date rangemedium_display- Materials and techniques usedimage_id- Identifier for IIIF image retrieval
Endpoint: GET /api/v1/agents/search
Purpose: Search for artists, creators, and other agents in the collection.
Query Parameters:
q(string, required) - Artist name or keywordfields(string) - Fields to returnlimit(number) - Number of results
Example Request:
fetch(
`https://api.artic.edu/api/v1/agents/search?q=Van Gogh&fields=id,title&limit=5`
)Response Structure:
{
"data": [
{
"id": 67890,
"title": "Vincent van Gogh"
}
]
}Usage in Art Explorer: When a user searches for an artist name, we:
- Search both artworks and agents in parallel
- For each matching artist, fetch additional artworks
- Merge all results and remove duplicates
- Display up to 24 unique artworks
Endpoint: GET /iiif/2/{image_id}/full/{size}/0/default.jpg
Purpose: Retrieve artwork images using the International Image Interoperability Framework (IIIF).
URL Structure:
https://lakeimagesweb.artic.edu/iiif/2/{image_id}/full/{width},/0/default.jpg
Parameters:
{image_id}- Image identifier from artwork data{width}- Desired image width (we use 843px for thumbnails)
Example:
const imageUrl = `https://lakeimagesweb.artic.edu/iiif/2/${artwork.image_id}/full/843,/0/default.jpg`;Note: We use lakeimagesweb.artic.edu instead of www.artic.edu/iiif/2 because the LAKE system is the Art Institute's content management system and provides reliable image access.
β
No Authentication Required - Public API, free to use
β
CORS Enabled - Works directly from browser
β
Rate Limiting - Generous limits for public use
β
Public Domain Filter - Option to show only public domain artworks
β
Rich Metadata - Comprehensive artwork information
β
High-Quality Images - IIIF standard for flexible image delivery
The Art Institute API is generous with rate limits for public use. However, we implement:
- Parallel requests for efficiency
- Result limiting (24 items max)
- Error handling and retry logic
- Client-side caching considerations
For complete API documentation, visit:
- Node.js 18.0.0 or higher
- npm 9.0.0 or higher (comes with Node.js)
- Modern web browser (Chrome, Firefox, Safari, Edge)
-
Clone the repository
git clone https://github.com/yourusername/art-explorer.git cd art-explorer -
Install dependencies
npm install
-
Start the development server
npm run dev
-
Open your browser
- Navigate to
http://localhost:5173 - The app will automatically reload when you make changes
- Navigate to
After starting the dev server, you should see:
- β Vite dev server running on port 5173
- β No console errors
- β Artworks loading from the API
- β Interactive UI responding to clicks
# Start development server with hot module replacement
npm run dev
# Build for production (creates optimized dist/ folder)
npm run build
# Preview production build locally
npm run preview
# Run ESLint to check code quality
npm run lint-
Browse by Style
- Select an art movement from the style selector
- View artworks in a responsive grid
- Click "Load More Artworks" for pagination
-
Search for Artworks
- Type in the search bar (artwork title, artist name, or keyword)
- Click "Search" or press Enter
- View unified results from artworks and artists
-
Save Favorites
- Click the heart icon on any artwork card
- Toggle the "Favorites" button to view saved items
- Favorites persist across browser sessions
-
Explore Artwork Details
- Click a card to flip and see metadata
- Click the expand icon for full-screen viewing
- View artist, date, and medium information
art-explorer/
βββ public/
β βββ vite.svg # Vite logo
βββ src/
β βββ assets/
β β βββ react.svg # React logo
β βββ components/
β β βββ ArtCard.jsx # Individual artwork card with flip animation
β β βββ Gallery.jsx # Main gallery container with search & filters
β β βββ SearchBar.jsx # Search input component
β β βββ StyleSelector.jsx # Art movement selector buttons
β βββ context/
β β βββ FavoritesContext.jsx # React Context for favorites state
β βββ hooks/
β β βββ useFavorites.js # Custom hook for favorites (alternative to context)
β βββ App.jsx # Root component with FavoritesProvider
β βββ index.css # Global styles and CSS variables
β βββ main.jsx # Application entry point
βββ .gitignore # Git ignore rules
βββ index.html # HTML template with SEO meta tags
βββ netlify.toml # Netlify deployment configuration
βββ package.json # Dependencies and scripts
βββ vite.config.js # Vite build configuration
βββ README.md # This file
App
βββ FavoritesProvider (Context)
βββ Gallery
βββ SearchBar
βββ StyleSelector
βββ ArtCard[] (mapped from artworks)
βββ [Flip Animation]
βββ [Full-Screen Modal]
-
Global State (Context)
FavoritesContextmanages favorites array- Persists to localStorage automatically
- Provides
toggleFavorite,isFavorite,getFavoriteCount
-
Component State (Hooks)
Gallery: Manages artworks, loading, search query, selected styleArtCard: Manages flip state and modal visibilitySearchBar: Manages input value
-
Data Flow
- User interaction β State update β API call β Render update
Art Explorer is configured for easy deployment on Netlify.
-
Push to GitHub
git add . git commit -m "Ready for deployment" git push origin main
-
Deploy on Netlify
- Go to netlify.com
- Click "Add new site" β "Import an existing project"
- Connect your GitHub repository
- Netlify auto-detects settings from
netlify.toml - Click "Deploy site"
-
Your site is live!
- Visit your site at
https://art.anshumani.com - Automatic deployments on every push
- Visit your site at
The netlify.toml file configures:
- Build command:
npm run build - Publish directory:
dist - SPA routing: All routes redirect to
index.html - Node version: 18
Vercel:
npm i -g vercel
vercelGitHub Pages:
npm install --save-dev gh-pages
npm run deploySee DEPLOYMENT.md for detailed deployment instructions.
- Code Splitting: React vendor and Lucide icons in separate chunks
- Minification: ESBuild for fast, optimized bundles
- Tree Shaking: Unused code automatically removed
- Asset Optimization: CSS and JS minified and gzipped
dist/
βββ index.html (1.97 KB)
βββ assets/
β βββ index-[hash].css (1.01 KB, gzipped: 0.51 KB)
β βββ react-vendor-[hash].js (11.21 KB, gzipped: 4.03 KB)
β βββ lucide-icons-[hash].js (2.44 KB, gzipped: 1.27 KB)
β βββ index-[hash].js (197.90 KB, gzipped: 61.36 KB)
Total Size: ~213 KB (67 KB gzipped)
- β Lazy loading ready (can be added for images)
- β Efficient re-renders with React 19
- β Optimized API calls with parallel requests
- β Client-side caching with localStorage
- β Fast initial load with code splitting
- Image Lazy Loading - Load images as user scrolls
- Loading Skeletons - Better loading states
- Error Retry - Automatic retry on API failures
- Advanced Filters - Filter by date, medium, artist nationality
- Collections - Organize favorites into custom collections
- Share Functionality - Share artworks and collections
- PWA Support - Installable app with offline support
- Dark/Light Theme Toggle - User preference
- Keyboard Navigation - Full keyboard accessibility
- Artwork Comparison - Side-by-side comparison tool
- User accounts with cloud sync
- Social features (comments, sharing)
- Artwork recommendations
- Educational content (art history, artist bios)
- High-resolution image downloads
- Virtual gallery tours
- Artwork timeline visualization
See DEPLOYMENT.md for the complete enhancement roadmap.
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Commit with descriptive messages (
git commit -m 'Add amazing feature') - Push to your fork (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow existing code style and patterns
- Add comments for complex logic
- Test your changes thoroughly
- Update documentation as needed
- Keep commits focused and atomic
- π Bug fixes
- β¨ New features
- π Documentation improvements
- π¨ UI/UX enhancements
- β‘ Performance optimizations
- βΏ Accessibility improvements
- π§ͺ Test coverage
This project is licensed under the MIT License - see the LICENSE file for details.
- Art Institute of Chicago - For providing the amazing public API and art collection
- React Team - For the incredible framework
- Vite Team - For the blazing-fast build tool
- Lucide - For the beautiful icon set
- Google Fonts - For Inter and Playfair Display fonts
- Art Institute of Chicago
- Art Institute API Documentation
- IIIF Image API
- React Documentation
- Vite Documentation
Made with β€οΈ for art lovers everywhere
β Star this repo β’ π Report Bug β’ π‘ Request Feature