BambooMintKey
A zero-dependency, high-performance cross-platform Vietnamese IME for Windows, macOS & Linux (bao gồm cả Steam Deck / SteamOS qua Flatpak), powered by .NET 10, F# and NativeAOT.
BambooMintKey là bộ gõ tiếng Việt Telex với lõi xử lý ngôn ngữ thuần chức năng (F#) dùng chung trên đa nền tảng. Bằng cách biên dịch toàn bộ engine và giao diện bằng NativeAOT, BambooMintKey đạt được hiệu năng gần mức native, kích thước nhỏ gọn và không phụ thuộc vào runtime .NET trên máy người dùng.
- Windows — Text Input Processor (TIP) chạy như In-Process COM Server bên trong tiến trình ứng dụng, tích hợp sâu vào Text Services Framework (TSF).
- Linux — Fcitx5 addon (C++) gọi engine qua C-ABI, kèm giao diện cài đặt Avalonia độc lập.
- Steam Deck (SteamOS) — Flathub Addon Extension tích hợp tự động với Fcitx5 Flatpak mà không sửa đổi phân vùng hệ thống read-only.

Tổng quan Công nghệ
| Thành phần | Windows | Linux | macOS (mục tiêu tiếp theo) |
|---|
| Hệ thống con IME | TSF (Text Services Framework) | Fcitx5 | InputMethodKit (IMK) |
| Cầu nối tầng ngoài | COM In-Process Server | C++ Addon + D-Bus | Objective-C / Swift |
| Cầu nối Native (.NET 10) | C# NativeAOT BambooMintKey.dll (BambooMintKey.NativeBridge) | C# NativeAOT BambooMintKeyCore.so (BambooMintKey.Core.Native via C-ABI) | C# NativeAOT libBambooMintKey.dylib via C-ABI |
| Lõi xử lý từ vựng | F# BambooMintKey.Core (Telex, Syllable, Unicode) | F# BambooMintKey.Core (dùng chung 100%) | F# BambooMintKey.Core (dùng chung 100%) |
| Giao diện cấu hình | Avalonia UI (BambooMintKey.UI) | Avalonia UI (BambooMintKey.UI.Linux) + D-Bus client | Avalonia UI (chạy native macOS) |
Kiến trúc chung
┌─────────────────────────────────────────────────────────────────────────┐
│ BambooMintKey │
├─────────────────────┬─────────────────────┬─────────────────────────────┤
│ Windows │ Linux │ macOS (TBD) │
│ TSF In-Proc COM │ Fcitx5 C++ Addon │ InputMethodKit │
│ (NativeAOT DLL) │ + D-Bus V/E │ (NativeAOT) │
├─────────────────────┴─────────────────────┴─────────────────────────────┤
│ BambooMintKey.NativeBridge / Core.Native │
│ — C# NativeAOT bridge — │
├─────────────────────────────────────────────────────────────────────────┤
│ BambooMintKey.Core (F#) — Telex/Syllable/Unicode │
├─────────────────────────────────────────────────────────────────────────┤
│ BambooMintKey.UI (Windows) │ BambooMintKey.UI.Linux (Linux+D-Bus) │
│ — Avalonia configuration UI — │
└─────────────────────────────────────────────────────────────────────────┘
Chi tiết kiến trúc từng nền tảng: xem docs/SYSTEM_ARCHITECTURE.md.
Tính Năng (Windows)
- Gõ Telex tiếng Việt chuẩn (
aa → â, dd → đ, as → á, v.v.).
- Tích hợp Windows TSF: hiển thị trên Language Bar, chuyển đổi bằng
Win + Space.
- In-Process NativeAOT: toàn bộ bộ gõ được biên dịch thành một DLL C gốc duy nhất (
BambooMintKey.dll).
- Xử lý phím mức hệ thống qua
ITfKeyEventSink, không dựa vào giả lập phím.
- Lõi F# thuần chức năng: engine Telex, parser vần, bảng Unicode được viết bằng F# và liên kết tĩnh với C# NativeBridge.
- Taskbar icon động V/E tích hợp Windows Input Indicator, cho phép chuyển chế độ bằng click chuột trái.
- Context menu trên Taskbar để chuyển nhanh chế độ gõ, kiểu gõ, bảng mã và mở cài đặt.
- Cửa sổ Settings GUI độc lập (Avalonia) với gõ thử nghiệm trực tiếp, phím tắt tùy chỉnh và cấu hình đa tab.
- Cấu hình đồng bộ thời gian thực giữa TIP, taskbar và Settings GUI qua shared memory +
config.json.
Linux (Fcitx5) & Steam Deck (Flatpak)
BambooMintKey chạy trên Linux qua Fcitx5, tái sử dụng nguyên lõi engine F# (không can thiệp code Windows). Gồm các thành phần:
| Thành phần | Công nghệ | Vai trò |
|---|
BambooMintKey.Core.Native | C# NativeAOT | Đóng gói engine F# thành C-ABI BambooMintKeyCore.so |
BambooMintKey.Fcitx5 | C++ / CMake | Addon Fcitx5 libbamboomintkey.so, D-Bus V/E, icon động |
BambooMintKey.UI.Linux | Avalonia / F# | Giao diện cài đặt độc lập (6 tab) |
manifests/flatpak/ | Flatpak / Flathub | Cấu hình Fcitx5 Addon Extension cho Steam Deck & Flathub |
Tính năng chính
- Gõ Telex chuẩn — dùng chung engine F# với Windows.
- Chuyển V/E bằng phím
` (grave, dưới Esc), icon V/E động trên khay hệ thống.
- Đồng bộ trạng thái V/E qua D-Bus (signal
ModeChanged).
- Cấu hình XDG
~/.config/bamboomintkey/config.json, hot-reload qua inotify.
- Cài đặt native trong
fcitx5-configtool + GUI Avalonia.
- Hỗ trợ Ubuntu/Debian (.deb), Fedora (.rpm), và Steam Deck / SteamOS (Flathub Flatpak).
Cài đặt nhanh
Trên Linux thông thường (Ubuntu/Debian, Fedora):
cd /đường/dẫn/tới/BambooMintKey
./scripts/linux/install_linux.sh # build + cài vào /usr (cần sudo)
./scripts/linux/uninstall_linux.sh # gỡ sạch
Đóng gói bộ cài (DEB, RPM, Flatpak):
./scripts/linux/package_linux.sh # đóng gói .deb, .rpm, .tar.gz vào delivery/linux/
./scripts/linux/package_flatpak.sh # đóng gói Flatpak extension vào delivery/flatpak/
Hướng dẫn chi tiết: docs/BUILD_LINUX.md · Kiến trúc Flathub: docs/2.Design/Phase9/009_02_Flathub_Independent_Architecture.md.
Trạng Thái Hiện Tại
Dự án đã hoàn thành Phase 9, bộ gõ hiện đã sử dụng được trên Windows và Linux, đồng thời hỗ trợ đóng gói phân phối qua nhiều kênh.
Windows
| Hạng mục | Trạng thái | Ghi chú |
|---|
| TSF Text Input Processor (TIP) | ✅ Hoạt động | In-Process COM Server NativeAOT (BambooMintKey.dll). |
| Key event xử lý phím hệ thống | ✅ Hoạt động | ITfKeyEventSink, không dùng giả lập phím. |
| Taskbar icon động V/E | ✅ Hoạt động | Vẽ GDI, đồng bộ qua Input Mode Compartment. |
| Context menu trên Taskbar | ✅ Hoạt động | Chuyển chế độ gõ, kiểu gõ, bảng mã, mở Settings/About. |
| Settings GUI (Avalonia) | ✅ Hoạt động | 4 tab cấu hình đầy đủ. |
Cấu hình config.json + đồng bộ cross-process | ✅ Hoạt động | Shared memory + Manual-Reset event. |
| Bộ cài Inno Setup / Microsoft Store | ✅ Hoạt động | Đã đăng và kiểm thử trên Microsoft Store. |
Linux (Fcitx5)
| Hạng mục | Trạng thái | Ghi chú |
|---|
| Fcitx5 engine addon | ✅ Hoạt động | libbamboomintkey.so, gọi engine qua BambooMintKeyCore.so. |
| Xử lý phím và preedit | ✅ Hoạt động | fcitx::KeyEvent, client preedit + input panel. |
| Đồng bộ V/E qua D-Bus | ✅ Hoạt động | ModeChanged signal, single-owner service. |
| Hot-reload cấu hình | ✅ Hoạt động | inotify trên ~/.config/bamboomintkey/config.json. |
| Settings GUI (Avalonia) | ✅ Hoạt động | 6 tab, kết nối D-Bus đến engine. |
Gói phân phối .deb / .rpm | ✅ Đã build thử | Ubuntu/Debian và Fedora đều ổn thỏa. |
Các giai đoạn tiếp theo đang tập trung vào ổn định hóa, hiệu năng, và mở rộng sang macOS.
Ảnh Chụp Màn Hình
| Taskbar icon tiếng Việt (V) | Taskbar icon tiếng Anh (E) |
|---|
 |  |

| Tab Bàn phím & Phím tắt | Tab Tùy chọn gõ |
|---|
 |  |

Yêu Cầu
Windows
| Thành phần | Phiên bản |
|---|
| Windows | Windows 10/11 (64-bit) |
| .NET SDK | 10.0 hoặc mới hơn |
| Công cụ build | dotnet CLI |
| Windows SDK | Được khuyến nghị để phát triển TSF |
Linux
| Thành phần | Phiên bản |
|---|
| Fcitx5 | 5.1.x |
| .NET SDK | 10.0 |
| CMake + g++ | 3.16+ / C++17 |
| clang + lld | — (cho NativeAOT) |
Chi tiết cài dependency: docs/BUILD_LINUX.md.
Bắt Đầu Nhanh (Windows)
Cài Đặt (Người dùng cuối)
Tải và cài đặt trực tiếp từ Microsoft Store:
Hoặc cài nhanh qua winget (từ Microsoft Store):
winget install --source msstore XPDP9V267NTQ42
Hoặc tải bộ cài đặt độc lập BambooMintKey-Setup.exe từ GitHub Releases.
Dành cho Lập trình viên & Tự Build
1. Build
# Build toàn bộ solution
dotnet build BambooMintKey.slnx -c Release
# Publish NativeAOT DLL để chạy trên Windows
dotnet publish src/BambooMintKey.NativeBridge/BambooMintKey.NativeBridge.csproj `
-c Release -r win-x64 --self-contained `
-o publish/win-x64 `
-p:NativeLib=Shared -p:PublishAot=true
> Lưu ý khi publish bị lỗi "file is being used by another process":
> Nếu BambooMintKey.dll trong publish/win-x64 bị khóa bởi Windows Explorer hoặc IDE (Rider, VS), hãy restart Windows Explorer:
>
> powershell > Stop-Process -Name explorer -Force > Start-Process explorer >
>
> Sau đó chạy lại lệnh dotnet publish.
2. Đăng Ký Bộ Gõ (Administrator)
pwsh -File scripts/windows/test-register.ps1
Script sẽ:
- Đăng ký CLSID COM In-Process Server.
- Tạo TSF Language Profile cho tiếng Việt (
0x042A).
- Đăng ký Category
GUID_TFCAT_TIP_KEYBOARD.
3. Kích Hoạt Cho User Hiện Tại
pwsh -File scripts/windows/enable-tip.ps1
Sau đó restart ctfmon:
Stop-Process -Name ctfmon -Force -ErrorAction SilentlyContinue
Start-Process ctfmon
4. Kiểm Tra
(Get-WinUserLanguageList | Where-Object { $_.LanguageTag -eq 'vi' }).InputMethodTips
Bạn sẽ thấy BambooMintKey trong danh sách input method của Vietnamese.
Kiến Trúc
┌─────────────────────────────────────────────────────────────────────┐
| Ứng dụng đích (Notepad, Word, Chrome, ...) |
| |
| ┌──────────────────────────────────────────────────────────────┐ |
| | Windows TSF Subsystem (msctf.dll) | |
| └───────────────────────┬──────────────────────────────────────┘ |
| │ COM Interface Calls |
| ┌──────────────────────▼──────────────────────────────────────┐ |
| | [C# NativeAOT] BambooMintKey.NativeBridge (BambooMintKey.dll)| |
| | - COM Exports: DllGetClassObject, DllRegisterServer, ... | |
| | - TSF Interfaces: ITfTextInputProcessorEx, ITfKeyEventSink | |
| | - State Bridge & Composition Manager | |
| └───────────────────────┬──────────────────────────────────────┘ |
| │ In-Memory Fast Call |
| ┌──────────────────────▼──────────────────────────────────────┐ |
| | [F#] BambooMintKey.Core | |
| | - Telex Engine, Syllable Parser, Unicode Tables | |
| └───────────────────────────────────────────────────────────────┘ |
└─────────────────────────────────────────────────────────────────────┘
Chi tiết kiến trúc hệ thống toàn diện có sơ đồ xem tại Tài liệu Kiến trúc Hệ thống (System Architecture). Chi tiết thiết kế xem tại docs/2.Design/Phase2/ và trạng thái UI/Context Management tại docs/2.Design/Phase3/.
Cấu Trúc Thư Mục
| Thư mục | Mô tả |
|---|
src/BambooMintKey.Core | Lõi F#: engine Telex, parser, domain types. |
src/BambooMintKey.NativeBridge | C# NativeAOT: COM server, TSF interfaces, bridge sang F#. |
src/BambooMintKey.Shared | Thư viện dùng chung giữa Core và NativeBridge. |
src/BambooMintKey.UI | Giao diện Avalonia độc lập: Settings, About và khung gõ thử nghiệm. |
src/BambooMintKey.DevHarness | Console harness kiểm thử COM/TSF nội bộ. |
src/BambooMintKey.Core.Native | C# NativeAOT: thư viện C-ABI BambooMintKeyCore.so cho Linux. |
src/BambooMintKey.Fcitx5 | Addon Fcitx5 (C++/CMake): libbamboomintkey.so, D-Bus, icon. |
src/BambooMintKey.UI.Linux | Giao diện cài đặt Avalonia (F#) cho Linux. |
tests/BambooMintKey.Core.Tests | Unit tests F# cho Telex engine. |
tests/BambooMintKey.Fcitx5.Tests | Unit tests C++ cho Fcitx5 addon. |
scripts/ | Script phân loại theo nền tảng: linux/ (cài đặt, gỡ bỏ, đóng gói DEB/RPM/Flatpak), windows/ (build AOT, TIP, installer), tools/ (từ điển, icon), tests/ (test C-ABI). |
manifests/ | File manifest phân phối: flatpak/ (Flathub extension cho Steam Deck). |
delivery/ | Thư mục chứa gói thành phẩm build: installer/ (Windows Setup), linux/ (DEB, RPM), flatpak/ (Flatpak bundle). |
docs/ | Tài liệu kiến trúc, hướng dẫn build và phân tích kỹ thuật. |
docs/3.Issue/ | Template và báo cáo phân tích/xử lý sự cố kỹ thuật. |
Giấy Phép
Dự án được phát hành dưới MIT License.
Copyright (c) 2026 Dương Gia Long and LMO contributors