Easy Hosts is a modern cross-platform desktop application that simplifies management of the hosts file on Windows, Linux, and macOS. With an intuitive interface, powerful features, and automatic backups, Easy Hosts makes it easy to manage domain-to-IP mappings for local development, ad blocking, and network testing.
- User-Friendly Interface: Clean, modern UI with dark mode support
- Safe Editing: Automatic backups before every save
- Multi-Language: Support for English and Korean (한국어)
- Profile Management: Save and switch between different host configurations
- Network Testing: Built-in ping testing and DNS lookup
- Smart Organization: Tag-based filtering and duplicate detection
- Version Control: Undo/Redo support with 50-state history
- ✅ Visual Hosts Editor: Toggle entries on/off without deleting them
- ✅ Bulk Management: Add, edit, or delete multiple entries efficiently
- ✅ Search & Filter: Quick search and tag-based filtering
- ✅ Duplicate Detection: Automatically detect conflicting domain mappings
- ✅ Network Tools: Built-in ping test and DNS lookup
- 🔄 Undo/Redo: 50-state history with Ctrl+Z/Ctrl+Y support
- 💾 Auto Backup: Automatic backups on every save
- 📁 Profile System: Save and load different host configurations
- 🌐 Multi-Language: English and Korean language support
- 🎨 Dark Mode: Beautiful dark theme for late-night coding
- 📤 Import/Export: JSON and hosts file format support
- 🏷️ Tag System: Organize entries with custom tags
- 🔒 Administrator Detection: Warns if running without admin privileges
- 💾 Automatic Backups: Creates timestamped backups before changes
- ✅ Input Validation: Prevents invalid IP addresses and domains
- 🛡️ XSS Protection: Sanitizes all user input
- 📝 Version Management: Data format versioning for compatibility
📸 Screenshots coming soon
- Operating System:
- Windows 10/11 (64-bit)
- Linux (Ubuntu 20.04+, Fedora 35+, or equivalent)
- macOS 11 Big Sur or later
- Privileges:
- Windows: Administrator rights required for saving changes
- Linux: Root or sudo privileges required
- macOS: Sudo privileges required
- Disk Space: ~50MB
- Download the Windows installer (.msi or .exe) from the Releases page
- Run the installer and follow the setup wizard
- Launch Easy Hosts as Administrator (right-click → "Run as administrator")
- Follow the onboarding tutorial on first launch
- Download the appropriate package for your distribution:
.debfor Debian/Ubuntu.rpmfor Fedora/RHEL.AppImagefor universal Linux
- Install the package:
# For Debian/Ubuntu sudo dpkg -i easyhosts_*.deb # For Fedora/RHEL sudo rpm -i easyhosts_*.rpm # For AppImage chmod +x easyhosts_*.AppImage
- Run with sudo:
sudo easyhosts
- Download the
.dmgfile from the Releases page - Open the DMG and drag Easy Hosts to Applications
- Run from Terminal with sudo:
sudo /Applications/EasyHosts.app/Contents/MacOS/EasyHosts
To save changes to the hosts file, Easy Hosts must run with elevated privileges:
Windows:
- Right-click
EasyHosts.exe→ Select "Run as administrator" - Or set permanent admin mode in Properties → Compatibility tab
Linux:
sudo easyhostsmacOS:
sudo /Applications/EasyHosts.app/Contents/MacOS/EasyHostsOn first launch, Easy Hosts displays an onboarding tutorial covering:
- What is a hosts file?
- Administrator privilege requirements
- Automatic backup system
- Basic navigation
- Click the "Add Entry" button
- Enter the IP address (e.g.,
127.0.0.1) - Enter one or more domains (space-separated)
- Add an optional comment for documentation
- Add optional tags for organization (comma-separated)
- Click "Add Entry" or press Ctrl+Enter
💡 Tip: Click the DNS lookup button (🔍) to automatically resolve a domain to its IP address
- Click the Edit icon on any entry card
- Modify the fields as needed
- Click "Save Changes"
- Click the toggle switch on any entry to enable/disable it
- Disabled entries are commented out in the hosts file (prefixed with
#)
- Use the search bar to find entries by IP, domain, or comment
- Click tags in the filter bar to show only entries with those tags
- Click the "Clear filters" button to reset
- Open Settings → "Manage Profiles"
- Click "Create New Profile" to save current configuration
- Click a profile card to activate it
- Use the trash icon to delete unwanted profiles
Use Cases:
- Development profile with local service mappings
- Production testing profile
- Ad-blocking profile
- Client-specific profiles
Easy Hosts automatically creates a backup before every save. To restore:
- Open Settings → "Manage Backups"
- Select a backup from the list
- Click "Restore" to revert to that backup
Export:
- Open Settings → "Export"
- Choose format (JSON or Hosts file)
- Select save location
Import:
- Open Settings → "Import"
- Select a JSON backup file
- Choose "Merge" or "Replace" mode
- Click "Import"
| Shortcut | Action |
|---|---|
Ctrl+Z |
Undo |
Ctrl+Y or Ctrl+Shift+Z |
Redo |
Ctrl+Enter |
Save entry in Add/Edit modal |
Escape |
Close modal |
Frontend:
- React 19 - UI framework
- TypeScript - Type-safe development
- Vite - Build tool and dev server
- CSS Variables - Theme system
Backend:
- Tauri 2 - Desktop application framework
- Rust - High-performance backend
Key Libraries:
lucide-react- Icon library@tauri-apps/plugin-dialog- File dialogs@tauri-apps/plugin-fs- File system access
EasyHosts/
├── src/
│ ├── components/ # React components
│ │ ├── AddEntryModal.tsx
│ │ ├── BackupModal.tsx
│ │ ├── EntryCard.tsx
│ │ ├── ExportModal.tsx
│ │ ├── Header.tsx
│ │ ├── ImportModal.tsx
│ │ ├── OnboardingModal.tsx
│ │ ├── PermissionModal.tsx
│ │ ├── ProfileModal.tsx
│ │ ├── SearchBar.tsx
│ │ ├── SectionHeader.tsx
│ │ └── SettingsModal.tsx
│ ├── contexts/ # React contexts
│ │ └── LanguageContext.tsx
│ ├── i18n/ # Internationalization
│ │ ├── index.ts
│ │ └── languages/
│ │ ├── en.ts
│ │ └── ko.ts
│ ├── utils/ # Utility functions
│ │ └── version.ts
│ ├── App.tsx # Main application component
│ ├── types.ts # TypeScript type definitions
│ ├── index.css # Global styles
│ └── main.tsx # Application entry point
├── src-tauri/ # Rust backend (Tauri)
├── package.json
├── tsconfig.json
└── vite.config.ts
- User Action → React Component
- Component → Tauri API (
invoke()) - Tauri Backend → File System / OS APIs
- Response → Component State
- State Update → UI Re-render
- Local State:
useStatefor component-specific data - Context API:
LanguageContextfor global language settings - History Stack: Undo/Redo with 50-state limit
- LocalStorage: Persistent settings (theme, language, onboarding)
- Node.js 18+ and npm
- Rust 1.70+
- Windows SDK (for Tauri development)
-
Clone the repository
git clone https://github.com/yourusername/easyhosts.git cd easyhosts -
Install dependencies
npm install
-
Run in development mode
npm run tauri dev
-
Build for production
npm run tauri build
npm run dev # Run Vite dev server only
npm run build # Build frontend only
npm run tauri dev # Run full Tauri app in dev mode
npm run tauri build # Build production executable- TypeScript: Strict mode enabled
- React: Functional components with hooks
- CSS: CSS variables for theming
- Naming: PascalCase for components, camelCase for functions
The undo/redo system maintains a history stack of up to 50 states:
// History stored as deep copies
history: HostsData[]
historyIndex: number
// Operations
undo(): void // Navigate back in history
redo(): void // Navigate forward in history
addToHistory(data: HostsData): void // Add new stateLimitations:
- Maximum 50 states (oldest states are discarded)
- History cleared on app restart
- Branching: Creating a new state from middle of history discards "future" states
Data format versioning ensures compatibility:
interface HostsData {
version?: string; // e.g., "1.0.0"
entries: HostEntry[];
sections: Section[];
}- Major version changes break compatibility
- Minor/Patch changes maintain compatibility
- Legacy data (no version field) is automatically migrated
Tags provide flexible organization:
- Auto-generated: Untagged entries get an automatic "etc" tag
- Filtering: Click tags to filter entries
- Limits: Maximum 20 tags per entry
- Validation: Each tag limited to 50 characters
The duplicate detection system warns when multiple entries map the same domain to different IPs:
interface DuplicateEntry {
domain: string;
entries: Array<{ index: number; ip: string }>;
}This helps prevent DNS resolution conflicts.
Contributions are welcome! Here's how you can help:
- Check existing Issues
- Create a new issue with:
- Clear description
- Steps to reproduce
- Expected vs actual behavior
- System information (Windows version, app version)
- Open a Feature Request
- Describe the use case and benefit
- Provide examples if applicable
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Write type-safe TypeScript
- Use React hooks and functional components
- Follow existing code style
- Add comments for complex logic
- Test on Windows 10 and 11
- Update documentation as needed
- Cross-Platform Support: Windows, Linux, and macOS
- Multi-Language Support: English and Korean
- Profile Management: Save and switch between configurations
- Automatic Backups: Timestamped backups on every save
- Undo/Redo: 50-state history
- REL-01: Network-based automatic profile switching (SSID detection)
- REL-02: Extended network diagnostics (Traceroute, HTTP status checks)
- Future: Syntax highlighting in raw edit mode
- Future: Command-line interface (CLI)
- Future: Additional languages (Spanish, French, German, Japanese)
This project is licensed under the MIT License - see the LICENSE file for details.
- Tauri Team - For the amazing desktop app framework
- React Team - For the powerful UI library
- Lucide - For the beautiful icon set
- Community - For feedback and contributions
- 🐛 Bug Reports: GitHub Issues
- 💡 Feature Requests: GitHub Discussions
- 📧 Email: support@easyhosts.com
Made with ❤️ for developers who need better hosts file management