- Kotlin 97.9%
- JavaScript 1.4%
- Rust 0.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
fix: update text color to black in Markdown editor and toolbar button See merge request dhbw-se/se-tinf24b6/g3-twonote/twonote-editor!46 |
||
| .agent/skills/context7 | ||
| .github/prompts | ||
| .gitlab/issue_templates | ||
| commonMain/com/mikepenz/markdown/compose/elements | ||
| components | ||
| composeApp | ||
| docker | ||
| gradle | ||
| icons | ||
| plugins | ||
| plugins-processor | ||
| rust | ||
| server | ||
| shared | ||
| .dockerignore | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| AGENTS.md | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle.kts | ||
TwoNote
TwoNote is a Kotlin Multiplatform note-taking application built with a microkernel architecture, targeting Android, Web, Desktop (JVM), and Server platforms.
Documentation
For a comprehensive installation guide, please refer to the Manual Installation Documentation.
Architecture
The project follows a microkernel (plugin-based) architecture where almost all functionality is implemented as plugins. This design provides:
- Extensibility: New features can be added as plugins without modifying the core
- Modularity: Each plugin is self-contained and can be developed independently
- Flexibility: Plugins can be enabled/disabled and configured at runtime
- Maintainability: Clear separation between core kernel and feature implementations
Project Structure
-
/shared - The microkernel core
- Contains the plugin API and kernel implementation in commonMain
- Key components:
TwoNoteKernel: The core kernel interfacePluginManager: Handles plugin lifecycle and registrationPlugin&AutoPlugin: Base interfaces for plugin developmentPluginManifest: Plugin metadata and capabilities
-
/plugins - Plugin modules (all features are plugins!)
ui: User interface components and screenssettings: Application settings and configurationinfo: Information and about screensio: Input/output operations and file handling
-
/plugins-processor - KSP-based plugin processor
- Handles compile-time plugin discovery and code generation
-
/composeApp - Compose Multiplatform application
- Platform-specific implementations:
- commonMain: Shared UI code
- androidMain: Android-specific code
- jvmMain: Desktop (JVM) specific code
- wasmJsMain/jsMain: Web-specific code
- Platform-specific implementations:
-
/server - Ktor server application
Creating a Plugin
To create a new plugin:
- Create a new module under
/plugins - Implement the
PluginorAutoPlugininterface - Define your plugin's
PluginManifestwith metadata and capabilities - The plugin will be automatically discovered by the plugin processor
Building and Running
Android Application
Build and run the Android app using the run configuration from your IDE's toolbar or from terminal:
# macOS/Linux
./gradlew :composeApp:assembleDebug
# Windows
.\gradlew.bat :composeApp:assembleDebug
Desktop (JVM) Application
Run the desktop application:
# macOS/Linux
./gradlew :composeApp:run
# Windows
.\gradlew.bat :composeApp:run
Server
Run the Ktor server:
# macOS/Linux
./gradlew :server:run
# Windows
.\gradlew.bat :server:run
Web Application
Run the web application:
Wasm target (faster, modern browsers):
# macOS/Linux
./gradlew :composeApp:wasmJsBrowserDevelopmentRun
# Windows
.\gradlew.bat :composeApp:wasmJsBrowserDevelopmentRun
JS target (supports older browsers):
# macOS/Linux
./gradlew :composeApp:jsBrowserDevelopmentRun
# Windows
.\gradlew.bat :composeApp:jsBrowserDevelopmentRun
Technologies
- Kotlin Multiplatform: Cross-platform development
- Compose Multiplatform: Declarative UI framework
- Kotlin/Wasm: WebAssembly support for web targets
- Ktor: Server-side framework
- KSP (Kotlin Symbol Processing): Compile-time plugin processing