An open API service indexing awesome lists of open source software.

https://github.com/rajtilak-2020/vox

A web app that converts text to International Standard Morse Code with authentic audio playback and WAV export. Built with React, TypeScript, and Web Audio API.
https://github.com/rajtilak-2020/vox

cybersecurity morsecode morsecode-encoder project webdevelopment

Last synced: 8 months ago
JSON representation

A web app that converts text to International Standard Morse Code with authentic audio playback and WAV export. Built with React, TypeScript, and Web Audio API.

Awesome Lists containing this project

README

          



# Vox - Your Encrypted Thought.

**A web application that converts text to Morse code and generates authentic audio playback**

[![React](https://img.shields.io/badge/React-18.3.1-61DAFB?style=for-the-badge&logo=react&logoColor=white)](https://reactjs.org/)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.5.3-3178C6?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
[![Vite](https://img.shields.io/badge/Vite-5.4.2-646CFF?style=for-the-badge&logo=vite&logoColor=white)](https://vitejs.dev/)
[![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)

---

## 🎯 About The Project

**Vox** is a sophisticated web application that bridges modern communication with classical telegraphy. It converts alphanumeric text (A-Z, 0-9) into International Morse Code and generates high-quality audio representations using the Web Audio API. Built with React and TypeScript, Vox features a premium glassy UI with a black and green color scheme, delivering both aesthetic appeal and functional excellence.

### Why Vox?

- **Educational Tool**: Perfect for learning Morse code
- **Accessibility**: Convert text to audio for various use cases
- **Historical Preservation**: Keep the art of Morse code alive
- **Modern Implementation**: Leverages cutting-edge web technologies

---

## ✨ Features

### Core Functionality

- πŸ”€ **Real-time Text Conversion** - Instant Morse code translation as you type
- πŸ”Š **Authentic Audio Generation** - Web Audio API creates genuine dot and dash tones
- πŸ’Ύ **Audio Download** - Export Morse code as WAV files
- πŸ“‹ **One-click Copy** - Copy Morse code to clipboard
- βœ… **Input Validation** - Smart filtering of valid characters (A-Z, 0-9, spaces)
- πŸ“š **Reference Chart** - Interactive Morse code lookup table

### User Experience

- 🎨 **Premium Glassy UI** - Black background with vibrant green accents
- πŸ’¨ **Smooth Animations** - Professional, minimal transitions
- πŸ“± **Fully Responsive** - Seamless experience across all devices
- β™Ώ **Accessible Design** - WCAG compliant color contrasts
- ⚑ **Lightning Fast** - Powered by Vite for optimal performance

---

## πŸ›  Tech Stack

### Frontend

- **React 18.3.1** - Modern UI library with hooks
- **TypeScript 5.5.3** - Type-safe JavaScript
- **Vite 5.4.2** - Next-generation build tool
- **Tailwind CSS 3.4.1** - Utility-first CSS framework
- **Lucide React** - Beautiful icon library

### Audio Processing

- **Web Audio API** - Native browser audio generation
- **Custom WAV Encoder** - PCM audio encoding to WAV format

### Development Tools

- **ESLint** - Code linting and quality
- **PostCSS** - CSS processing
- **Autoprefixer** - CSS vendor prefixing

---

## πŸ— Architecture

### System Architecture

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Vox Application β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ User Input │────────▢│ Validation β”‚ β”‚
β”‚ β”‚ (Text) β”‚ β”‚ (A-Z,0-9) β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ β–Ό β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Morse Encoder β”‚ β”‚
β”‚ β”‚ (Converter) β”‚ β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β–Ό β–Ό β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Display Output β”‚ β”‚ Audio Service β”‚ β”‚
β”‚ β”‚ (Morse Code) β”‚ β”‚ (Web Audio API) β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β–Ό β–Ό β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Play Audio β”‚ β”‚ Download β”‚
β”‚ β”‚ (Browser) β”‚ β”‚ (WAV File) β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### Data Flow Diagram

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Start β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ User Types Text β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Validate Input │─────▢│ Show Error β”‚
β”‚ (A-Z, 0-9 only) β”‚ βœ— β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ βœ“
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Convert to Morse β”‚
β”‚ (Real-time) β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Display Morse β”‚
β”‚ Code Output β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚
β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Copy to β”‚ β”‚ Generate β”‚
β”‚ Clipboardβ”‚ β”‚ Audio β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚
β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Play β”‚ β”‚ Download β”‚
β”‚ Audio β”‚ β”‚ WAV β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### Audio Generation Workflow

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Morse String β”‚
β”‚ "... --- ..." β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Parse Symbols β”‚
β”‚ . = 80ms β”‚
β”‚ - = 240ms β”‚
β”‚ space = gap β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Web Audio API β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Create AudioContextβ”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β–Ό β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Generate Sine Wave β”‚ β”‚
β”‚ β”‚ Frequency: 600Hz β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β–Ό β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Apply Envelope β”‚ β”‚
β”‚ β”‚ (Attack/Release) β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β–Ό β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Create AudioBuffer β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚
β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Play β”‚ β”‚ Encode β”‚
β”‚ Buffer β”‚ β”‚ to WAV β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Download β”‚
β”‚ File β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### Component Architecture

```
App.tsx (Root Component)
β”‚
β”œβ”€β”€β”€ State Management
β”‚ β”œβ”€β”€β”€ inputText (string)
β”‚ β”œβ”€β”€β”€ morseCode (string)
β”‚ β”œβ”€β”€β”€ isPlaying (boolean)
β”‚ β”œβ”€β”€β”€ isGenerating (boolean)
β”‚ β”œβ”€β”€β”€ copied (boolean)
β”‚ └─── error (string)
β”‚
β”œβ”€β”€β”€ Effects
β”‚ └─── useEffect (Real-time conversion)
β”‚
β”œβ”€β”€β”€ Event Handlers
β”‚ β”œβ”€β”€β”€ handleConvert()
β”‚ β”œβ”€β”€β”€ handlePlay()
β”‚ β”œβ”€β”€β”€ handleDownload()
β”‚ └─── handleCopy()
β”‚
└─── UI Components
β”œβ”€β”€β”€ Header (Title & Description)
β”œβ”€β”€β”€ Input Panel
β”‚ β”œβ”€β”€β”€ Textarea (User Input)
β”‚ └─── Validation Error
β”œβ”€β”€β”€ Output Panel
β”‚ β”œβ”€β”€β”€ Morse Display
β”‚ └─── Copy Button
β”œβ”€β”€β”€ Action Buttons
β”‚ β”œβ”€β”€β”€ Convert Button
β”‚ β”œβ”€β”€β”€ Play Button
β”‚ └─── Download Button
β”œβ”€β”€β”€ MorseReference.tsx (Reference Chart)
└─── Footer (Copyright & Links)
```

---

## πŸš€ Getting Started

### Prerequisites

- **Node.js** (v18 or higher)
- **npm** (v9 or higher)

### Installation

1. **Clone the repository**

```bash
git clone https://github.com/rajtilak-2020/vox.git
cd vox
```

2. **Install dependencies**

```bash
npm install
```

3. **Start development server**

```bash
npm run dev
```

4. **Open your browser**

Navigate to `http://localhost:5173`

### Build for Production

```bash
npm run build
```

The optimized production build will be in the `dist/` directory.

### Preview Production Build

```bash
npm run preview
```

---

## πŸ’‘ Usage

### Basic Conversion

1. Type your message in the input field (A-Z, 0-9, and spaces only)
2. The Morse code appears automatically in real-time
3. Click **Convert** to generate audio
4. Click **Play** to hear your message
5. Click **Download** to save the audio file

### Advanced Features

#### Copy to Clipboard

Click the **Copy** button next to the output to copy the Morse code to your clipboard.

#### Reference Chart

Scroll down to view the complete Morse code reference chart showing all letter and number mappings.

### Example Conversions

| Input Text | Morse Code Output |
|-----------|-------------------|
| HELLO | `.... . .-.. .-.. ---` |
| SOS | `... --- ...` |
| 123 | `.---- ..--- ...--` |
| HELLO WORLD | `.... . .-.. .-.. --- / .-- --- .-. .-.. -..` |

---

## πŸ” How It Works

### Morse Code Conversion

The application uses a mapping table that follows the International Morse Code standard:

```typescript
const MORSE_CODE_MAP: Record = {
'A': '.-', 'B': '-...', 'C': '-.-.',
'D': '-..', 'E': '.', 'F': '..-.',
// ... etc
};
```

**Conversion Process:**

1. Convert input to uppercase
2. Split into individual characters
3. Map each character to Morse code
4. Join with spaces between letters
5. Use '/' for word breaks

### Audio Generation

**Timing Standards:**

- **Dot duration**: 80ms
- **Dash duration**: 240ms (3Γ— dot)
- **Symbol gap**: 80ms (between dots/dashes)
- **Letter gap**: 240ms (between letters)
- **Word gap**: 560ms (between words)

**Audio Parameters:**

- **Frequency**: 600Hz (standard Morse tone)
- **Sample Rate**: 44.1kHz (CD quality)
- **Wave Type**: Sine wave
- **Amplitude**: 0.3 (30% to prevent clipping)
- **Envelope**: 5ms attack/release for smooth tones

### WAV Encoding

The application encodes audio to WAV format using:

- **Format**: PCM (Pulse Code Modulation)
- **Bit Depth**: 16-bit
- **Channels**: Mono (1 channel)
- **Sample Rate**: 44,100 Hz

---

## πŸ“ Project Structure

```
vox/
β”œβ”€β”€ public/
β”‚ └── vite.svg
β”œβ”€β”€ src/
β”‚ β”œβ”€β”€ components/
β”‚ β”‚ └── MorseReference.tsx # Morse code reference chart
β”‚ β”œβ”€β”€ services/
β”‚ β”‚ └── audioService.ts # Web Audio API & WAV encoding
β”‚ β”œβ”€β”€ utils/
β”‚ β”‚ └── morseCode.ts # Morse conversion logic
β”‚ β”œβ”€β”€ App.tsx # Main application component
β”‚ β”œβ”€β”€ main.tsx # Application entry point
β”‚ β”œβ”€β”€ index.css # Global styles
β”‚ └── vite-env.d.ts # TypeScript definitions
β”œβ”€β”€ .env # Environment variables
β”œβ”€β”€ .gitignore # Git ignore rules
β”œβ”€β”€ eslint.config.js # ESLint configuration
β”œβ”€β”€ index.html # HTML entry point
β”œβ”€β”€ package.json # Dependencies & scripts
β”œβ”€β”€ postcss.config.js # PostCSS configuration
β”œβ”€β”€ tailwind.config.js # Tailwind CSS configuration
β”œβ”€β”€ tsconfig.json # TypeScript configuration
β”œβ”€β”€ vite.config.ts # Vite configuration
└── README.md # This file
```

---

## πŸ“š API Reference

### Morse Code Utilities

#### `textToMorse(text: string): string`

Converts text to Morse code.

**Parameters:**
- `text` - Input string (A-Z, 0-9, spaces)

**Returns:**
- Morse code string with spaces between letters and `/` for word breaks

**Example:**
```typescript
textToMorse("HELLO") // Returns: ".... . .-.. .-.. ---"
```

#### `validateInput(text: string): boolean`

Validates if input contains only allowed characters.

**Parameters:**
- `text` - Input string to validate

**Returns:**
- `true` if valid, `false` otherwise

### Audio Service

#### `generateMorseAudio(morseCode: string): Promise`

Generates audio buffer from Morse code string.

**Parameters:**
- `morseCode` - Morse code string (dots, dashes, spaces)

**Returns:**
- Promise resolving to `{ audioBuffer, audioContext }`

#### `playMorseAudio(audioBuffer: AudioBuffer, audioContext: AudioContext): AudioBufferSourceNode`

Plays the generated Morse code audio.

**Parameters:**
- `audioBuffer` - Audio buffer to play
- `audioContext` - Web Audio context

**Returns:**
- Audio source node for playback control

#### `downloadMorseAudio(audioBuffer: AudioBuffer, filename?: string): void`

Downloads audio as WAV file.

**Parameters:**
- `audioBuffer` - Audio buffer to encode
- `filename` - Optional filename (default: "morse-code.wav")

---

## 🀝 Contributing

Contributions are what make the open-source community amazing! Any contributions you make are **greatly appreciated**.

### How to Contribute

1. **Fork the Project**
2. **Create your Feature Branch**
```bash
git checkout -b feature/AmazingFeature
```
3. **Commit your Changes**
```bash
git commit -m 'Add some AmazingFeature'
```
4. **Push to the Branch**
```bash
git push origin feature/AmazingFeature
```
5. **Open a Pull Request**

### Development Guidelines

- Follow the existing code style
- Write meaningful commit messages
- Add tests for new features
- Update documentation as needed
- Keep PRs focused and atomic

---

## πŸ“„ License

Distributed under the MIT License. See `LICENSE` for more information.

---

## πŸ‘€ Contact

**K Rajtilak**

- GitHub: [@rajtilak-2020](https://github.com/rajtilak-2020)
- Project Link: [https://github.com/rajtilak-2020/vox](https://github.com/rajtilak-2020/vox)

---

## πŸ™ Acknowledgments

- [React Documentation](https://react.dev/)
- [Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)
- [International Morse Code Standard](https://en.wikipedia.org/wiki/Morse_code)
- [Tailwind CSS](https://tailwindcss.com/)
- [Lucide Icons](https://lucide.dev/)
- [Vite](https://vitejs.dev/)

---

**Made with ❀️ by [rajtilak-2020](https://github.com/rajtilak-2020)**

⭐ Star this repository if you found it helpful!