A professional, feature-rich lyrics and chord viewer designed specifically for guitarists and singers. Built with React, TypeScript, and Vite for a modern, type-safe development experience.
- Synchronized Lyrics Display - View lyrics with real-time highlighting
- Interactive Chord Diagrams - Visual guitar chord representations
- Auto-Scroll - Automatic lyric scrolling with adjustable speed
- Chord Indicators - See which chord plays with each lyric line
- Song Transpose - Change key up/down by semitones to match your vocal range
- Playback Speed Control - Adjust auto-scroll speed from 0.5x to 2x with visual controls
- Powerful Search - Search by song title, artist, or tags
- Song Library - Beautiful modal with all your songs
- Favorites System - Save your favorite songs with one click
- Persistent Storage - Your preferences and favorites are saved locally
Space- Play/Pause auto-scroll↑- Previous lyric line↓- Next lyric lineL- Open song libraryF- Toggle favorite for current song
- Glassmorphism Design - Modern, sleek interface with backdrop blur
- Smooth Animations - Polished transitions and micro-interactions
- Toast Notifications - Instant visual feedback for all actions
- Responsive Layout - Works perfectly on desktop, tablet, and mobile
- Dark Theme - Easy on the eyes for long practice sessions
- CSS Modules - Scoped styling with no conflicts
- React 18 - Modern UI library with hooks
- TypeScript - Type safety and better developer experience
- Vite - Lightning-fast build tool and dev server
- CSS Modules - Scoped component styling
- React Icons - Beautiful icon library
src/
├── components/ # React components
│ ├── Header/ # Search, favorites, library controls
│ ├── Meta/ # Song information display
│ ├── LyricContainer/ # Auto-scrolling lyrics
│ ├── ChordContainer/ # Chord diagrams
│ ├── LibraryModal/ # Song selection modal
│ ├── SongCard/ # Individual song cards
│ ├── PlaybackControls/ # Speed and playback controls
│ ├── TransposeControl/ # Key transposition controls
│ └── Toast/ # Notification system
├── data/ # Song data (TypeScript)
├── hooks/ # Custom React hooks
├── types/ # TypeScript type definitions
├── utils/ # Utility functions (transpose, etc.)
├── assets/ # Images and static files
├── App.tsx # Main application component
├── App.css # App-specific styles
├── index.css # Global styles
└── main.tsx # Application entry point
- Node.js 18+ and npm
-
Clone the repository
git clone https://github.com/Bomjan/Lyric.git cd Lyric -
Install dependencies
npm install
-
Start development server
npm run dev
-
Open in browser
- Navigate to
http://localhost:5173
- Navigate to
npm run buildThe optimized production build will be in the dist/ directory.
npm run preview- The app loads with a default song
- Click on any lyric line to jump to that position
- Use the arrow keys to navigate line by line
- Press
Spaceto start/stop auto-scroll
- Type in the search bar at the top
- Search works across song titles, artists, and tags
- Results appear in real-time in the library modal
- Click the music icon or press
Lto open the library - Browse all available songs in a beautiful grid
- Click any song card to load it
- Songs marked with ❤️ are in your favorites
- Click the heart icon in the header
- Or press
Fon your keyboard - Favorites are saved automatically to localStorage
- View all favorites in the library (marked with ❤️)
Songs are defined in src/data/songs.ts. To add a new song:
-
Import the album image (if new):
import newSongImage from '../assets/new-song.webp';
-
Add the song object to the
songsarray:{ id: 'unique-song-id', title: 'Song Title', artist: 'Artist Name', key: 'C maj', tempo: 120, image: newSongImage, tags: ['genre', 'mood'], lyrics: [ { line: 'First line', chord: 'C', time: 0 }, { line: 'Second line', chord: 'G', time: 4 } ], chords: [ { name: 'C', guitar: [0, 3, 2, 0, 1, 0], piano: ['C', 'E', 'G'] } ] }
The app uses TypeScript for type safety. Key interfaces:
interface Song {
id: string;
title: string;
artist: string;
key: string;
tempo: number;
image: string;
tags: string[];
lyrics: Lyric[];
chords: Chord[];
}
interface Lyric {
line: string;
chord: string;
time: number;
}
interface Chord {
name: string;
guitar: number[];
piano: string[];
}Edit the CSS in component modules or src/index.css:
/* Main colors used throughout */
--primary: #2aa59c;
--secondary: #147171;
--accent: #e4d66a;
--background: #111717;In src/App.tsx, modify the settings default:
const [settings] = useLocalStorage<Settings>('settings', {
autoScroll: false,
scrollSpeed: 1, // Change this (0.5 = slower, 2 = faster)
fontSize: 19,
instrument: 'guitar'
});npm run dev- Start development servernpm run build- Build for productionnpm run preview- Preview production buildnpm run lint- Run ESLint
The project uses:
- TypeScript for type checking
- ESLint for code linting
- CSS Modules for scoped styling
- Vite for fast builds
- Chrome/Edge 90+
- Firefox 88+
- Safari 14+
- Opera 76+
The app is fully responsive and works great on:
- Smartphones (320px and up)
- Tablets (768px and up)
- Desktops (1024px and up)
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is open source and available under the MIT License.
- React Icons for the beautiful icons
- Google Fonts for the Inter typeface
- All the musicians who inspire us to create
For questions, suggestions, or feedback:
- GitHub: @Bomjan
- Email: sundrabomjan@gmail.com
Made with ❤️ for guitarists and singers everywhere
