Notes app with a glassmorphism UI. The real product is the React + Vite web app — it syncs through Firebase, works offline, and can be installed as a PWA or wrapped with Capacitor for Android/iOS.
Live: glasswave.pages.dev
There is also a Flutter port in glasswave_flutter_ver/. Its UI is a 1:1 port of the React design (same tokens, glass layers, themes and screens), but it stores everything on-device and does not talk to Firebase.
- Create and edit notes in a TipTap rich-text editor (autosave)
- Pin, archive, trash, search, sort, and set reminders
- Sign in with email/password (reset + email verification) or stay a guest
- Signed-in notes sync via Firestore; guests stay in the browser (
localStorage) - Offline: Firestore IndexedDB cache on web, service-worker shell for the PWA
- 12 color themes, UI in Russian / English / Korean
- Reminders: in-app poller on web (only while the tab is open); native local notifications in the Capacitor apps
src/ React + Vite app (this is the product)
app/ screens, editor, settings, note services
i18n/ translations — single source of truth
hooks/ Firestore query hook
styles/
firebase.ts Auth + Firestore client
notifications.ts reminder sound / native notifications
pwa.ts
glasswave_flutter_ver/ Flutter port (local-only) — lib/, its platform
shells (android/ ios/ linux/ macos/ windows/),
pubspec.yaml and assets/translations/
android-capacitor/ Capacitor Android project
ios-capacitor/ Capacitor iOS project
src-tauri/ Tauri desktop shell (Linux AppImage / .deb)
docs/ APK, iOS, PWA, desktop, notification sound
firestore.rules owner-only notes + field/type/size checks
Needs Node.js 18+ (22+ if you also build the APK).
git clone https://github.com/aalmaz1/glasswave.git
cd glasswave
npm install
npm run dev # http://localhost:5173npm run typecheck
npm run lint
npm run format:check
npm run test
npm run build
npm run preview # production build + PWA service worker, :4173The web app already points at the official glasswave-4f5da project (Email/Password). You do not need a .env to log in.
To aim a fork or staging build at another project, copy .env.example to .env and set all six VITE_FIREBASE_* values from that project. Mixing keys from two projects is the usual cause of auth/operation-not-allowed.
If you override the config:
- Enable Email/Password (the password provider, not Email link)
- Add every host you serve from to Authentication → Settings → Authorized domains
- Do not set
VITE_FIREBASE_AUTH_EMULATORunless the emulator is actually running
Do not commit .env. Security rules live in firestore.rules — the snippet that used to sit in this README was incomplete.
Capacitor wraps the web build. Flutter’s native trees stay in glasswave_flutter_ver/android/ and glasswave_flutter_ver/ios/.
Android APK — Node 22+, JDK 21, Android SDK (compileSdk 36):
npm run android:apk
# android-capacitor/app/build/outputs/apk/release/app-release.apkPushes to main also typecheck, lint, test, and publish a GitHub Release APK (.github/workflows/apk_build.yml). Details: docs/android-apk.md.
iOS — no CI (needs a Mac + Apple signing). Details: docs/ios-app.md.
npm run cap:sync:ios
open ios-capacitor/App/App.xcworkspaceLinux desktop (AppImage) — Tauri wraps the same web build in the system
webkit (WebKitGTK), the same way Capacitor wraps it on Android. Needs Node 22+,
a Rust toolchain, and libwebkit2gtk-4.1-dev (+ libayatana-appindicator3-dev librsvg2-dev libxdo-dev patchelf):
npm run desktop:build
# src-tauri/target/release/bundle/appimage/GlassWave_<version>_amd64.AppImage
# src-tauri/target/release/bundle/deb/glasswave_<version>_amd64.debReleases published by the APK workflow automatically get the matching AppImage
and .deb attached (.github/workflows/appimage_build.yml); a manual build can
be triggered from the Actions tab. The AppImage expects libwebkit2gtk-4.1 on
the system — present on Ubuntu 22.04+/Debian 12/Fedora and friends.
PWA notes (install, offline shell, what reminders can and cannot do in the browser): docs/pwa.md. Notification sound across web / Android / iOS: docs/notification-sound.md.
Lives entirely in glasswave_flutter_ver/ and mirrors the
React UI: same design tokens, glass layers, 12 themes, dashboard/editor/settings
layout and the guest-first flow (sign-in lives inside Settings). Local-only —
accounts are a SHA-256 hash in shared_preferences, no cloud sync.
cd glasswave_flutter_ver
flutter pub get
flutter runDart SDK ^3.12.2 (see glasswave_flutter_ver/pubspec.yaml).
The dashboard is one screen with Notes / Archive / Trash tabs. Pinned notes sit at the top of Notes. Settings is a separate screen (account, theme, language, delete account).
| Shortcut | Action |
|---|---|
Ctrl/Cmd + N |
New note (dashboard) |
Ctrl/Cmd + F |
Focus search |
Ctrl/Cmd + S |
Save (editor) |
Esc |
Close editor / modal |
src/i18n/translations.ts is the only place to add strings. After editing it:
npm run i18n:export # regenerates glasswave_flutter_ver/assets/translations/{ru,en,ko}.json