Just keep coding
A lightweight, fast, and beautiful code editor built with Kotlin Multiplatform and Compose Multiplatform. Supporting 19+ programming languages with syntax highlighting, autocomplete, and more!
- π€ Android (Google Play)
- π iOS (App Store) (coming soon)
- π Web Version
- π¦ Latest Release (GitHub)
- 19 gorgeous themes (Dark & Light variants)
- Animated logo and smooth transitions
- Clean, distraction-free interface
- Responsive design for all screen sizes
- Syntax Highlighting - 19+ languages supported
- Smart Autocomplete - Context-aware suggestions with keyboard navigation
- Error Detection - Real-time syntax error highlighting
- Code Formatting - Auto-format your code beautifully
- Auto-Indentation - Intelligent indenting based on language
- Multi-tab Editing - Work on multiple files simultaneously
- Find & Replace - Regex support, case-sensitive, whole word matching
- Line Numbers - Toggle-able with gutter highlighting
- Undo/Redo - Full history support (up to 100 actions)
- Read-only Mode - View files without editing
- File explorer with CRUD operations
- Open files and folders
- Create, rename, delete files/folders
- Recent files tracking
- File details with metadata
- Cross-platform file system support
- Lightweight and fast
- Minimal resource usage
- Smooth scrolling and editing
- Optimized rendering
- Android - Native app
- iOS - Native app
- Desktop - Windows, macOS, Linux
- Web - WASM support
- JDK 17 or higher
- Android Studio (for Android development)
- Xcode (for iOS development, macOS only)
# Clone the repository
git clone https://github.com/Ma7moud3ly/nemo-editor.git
cd nemo-editor
# Run on Desktop
./gradlew :composeApp:run
# Run on Android
./gradlew :composeApp:installDebug
# Run on Web
./gradlew :composeApp:wasmJsBrowserDevelopmentRuncommonMain.dependencies {
implementation("io.github.ma7moud3ly:nemo-editor:1.0.2")
}@Composable
fun MyEditor() {
val codeState = rememberCodeState(
code = "fun main() {\n println(\"Hello\")\n}",
language = Language.KOTLIN
)
NemoCodeEditor(state = codeState)
}@Composable
fun PythonEditor() {
val codeState = rememberCodeState(
code = """
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
for i in range(10):
print(fibonacci(i))
""".trimIndent(),
language = Language.PYTHON
)
val editorSettings = remember {
EditorSettings(
theme = EditorThemes.NEMO_DARK,
tabSize = 4,
)
}
NemoCodeEditor(
state = codeState,
settings = editorSettings,
modifier = Modifier.fillMaxSize()
)
}See complete documentation for more examples.
| Language | Extensions | Highlighting | Formatting | Autocomplete | Errors |
|---|---|---|---|---|---|
| Kotlin | .kt, .kts | β | β | β | β |
| Python | .py | β | β | β | β |
| Java | .java | β | β | β | β |
| JavaScript | .js | β | β | β | β |
| TypeScript | .ts | β | β | β | β |
| C | .c, .h | β | β | β | β |
| C++ | .cpp, .hpp | β | β | β | β |
| C# | .cs | β | β | β | β |
| Go | .go | β | β | β | β |
| Rust | .rs | β | β | β | β |
| Swift | .swift | β | β | β | β |
| PHP | .php | β | β | β | β |
| Ruby | .rb | β | β | β | β |
| HTML | .html, .htm | β | β | β | β |
| CSS | .css, .scss | β | β | β | β |
| XML | .xml | β | β | β | β |
| JSON | .json | β | β | β | β |
| Markdown | .md | β | β | β | β |
| SQL | .sql | β | β | β | β |
| Shell | .sh, .bash | β | β | β | β |
Dark Themes:
- Nemo Dark (Default)
- Monokai
- Dracula
- One Dark
- Nord
- Gruvbox Dark
- Solarized Dark
- Material Palenight
- Atom One Dark
- Tokyo Night
Light Themes:
- Nemo Light
- GitHub Light
- Solarized Light
- Gruvbox Light
- Atom One Light
- Material Lighter
- Quiet Light
- Light+
- Tomorrow
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + N | β + N | New File |
| Ctrl + O | β + O | Open File |
| Ctrl + Shift + O | β + Shift + O | Open Folder |
| Ctrl + S | β + S | Save |
| Ctrl + Shift + S | β + Shift + S | Save As |
| Ctrl + W | β + W | Close Tab |
| Ctrl + Shift + W | β + Shift + W | Close All Tabs |
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + Z | β + Z | Undo |
| Ctrl + Y | β + Y | Redo |
| Ctrl + D | β + D | Duplicate Line |
| Ctrl + L | β + L | Delete Line |
| Ctrl + / | β + / | Toggle Comment |
| Ctrl + ] | β + ] | Indent |
| Ctrl + [ | β + [ | Unindent |
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + F | β + F | Find |
| Ctrl + H | β + H | Find & Replace |
| Ctrl + Shift + F | β + Shift + F | Format Code |
| Windows/Linux | macOS | Action |
|---|---|---|
| Ctrl + = | β + = | Zoom In |
| Ctrl + - | β + - | Zoom Out |
| Ctrl + B | β + B | Toggle Sidebar |
| Ctrl + Tab | β + Tab | Next Tab |
| Ctrl + Shift + Tab | β + Shift + Tab | Previous Tab |
- β - Select next
- β - Select previous
- Enter or Tab - Accept
- Esc - Dismiss
# Debug APK
./gradlew :composeApp:assembleDebug
# Release APK
./gradlew :composeApp:assembleRelease
# Output: composeApp/build/outputs/apk/Windows (MSI)
./gradlew :composeApp:packageMsi
# Output: composeApp/build/compose/binaries/main/msi/macOS (DMG)
./gradlew :composeApp:packageDmg
# Output: composeApp/build/compose/binaries/main/dmg/Linux (DEB)
./gradlew :composeApp:packageDeb
# Output: composeApp/build/compose/binaries/main/deb/# Development
./gradlew :composeApp:wasmJsBrowserDevelopmentRun
# Production
./gradlew :composeApp:wasmJsBrowserDistribution
# Output: composeApp/build/dist/wasmJs/productionExecutable/- NemoCodeEditor API - Complete API reference
- Keyboard Shortcuts - Complete shortcuts guide
Contributions are welcome! Here's how:
- 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
- Follow Kotlin coding conventions
- Write clear commit messages
- Add tests for new features
- Update documentation
- Ensure all platforms build
MIT License - see LICENSE file.
- Built with Kotlin Multiplatform
- UI by Compose Multiplatform
- Inspired by VSCode, Sublime Text, and other great editors
- Author: Mahmoud Aly
- GitHub: @Ma7moud3ly
- Project: Nemo Editor
- Issues: Report a bug
If you find Nemo Editor useful:
- β Star the repository
- π Report bugs
- π‘ Suggest features
- π€ Contribute code
- π’ Share with others
Made with β€οΈ using Kotlin Multiplatform
Nemo Editor - Just keep coding π
β Star on GitHub β’ π Documentation β’ π Report Bug β’ π¬ Discussions
