Tabs, a command palette, private reading and video messages at 120 fps. Free and open source.
SocialDart · HTMLGitHub @mollykittenOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
desktop telegram client on flutter. same layout as the official one + liquid glass and the stuff it's missing
Taken from the repository README
Loading the full README.
Read the full README ↗layout is the same as telegram desktop, so there's nothing to relearn. on top of it: liquid glass and the features the official client doesn't have.
[!NOTE] early stage, but already works: sign-in, chat list, chats with every message type, tabs, split view and the command palette. guides for users and plugin authors are at docs.mollygram.dev. what comes next is in
docs/roadmap.md, the backlog vs the official client indocs/parity.md.
| plugins | sandbox with explicit permissions declared in the manifest, s/o exteraGram. |
| privacy | ghost mode: no read receipts, no "typing", no "online". deleted messages and edit history saved locally. |
| media | video messages at 120 fps and up to 640×640, photos and videos go uncompressed by default. |
| chat workflow | tabs, split view for two chats, command palette on ⌘ K. |
| look | liquid glass only on the floating layer: sidebar, chat header, composer, palette. light and dark themes. |
| component | tech |
|---|---|
| ui | Flutter desktop, stable channel |
| protocol | TDLib via dart:ffi |
| plugins | javascript and typescript on QuickJS-ng, more in docs/plugins.md |
| platforms | macOS, windows, linux |
| package | what's in it |
|---|---|
packages/tdlib | dart:ffi bindings to td_json, the td_receive loop in a background isolate, td_api types generated from the schema |
packages/core | models and state on top of tdlib, no flutter dependency |
packages/ui_kit | shared widgets, glass, theme |
packages/media | video, video messages, voice messages |
packages/shell | window layout: chat tabs, split view, ⌘K command palette |
packages/plugin_host | plugin sandbox and the built-in filters and translate plugins |
packages/plugins_ui | plugins settings screen |
packages/plugin_sdk | typescript types for plugin authors |
packages/app | the app itself |
flutter comes through fvm. the version is pinned in .fvmrc, ci uses the same one. we track latest stable.
git clone --recurse-submodules https://github.com/mollykitten/mollygram.git
cd mollygram
fvm install
fvm flutter pub get
forgot --recurse-submodules? run git submodule update --init --recursive once, the plugin host builds quickjs from the quickjs-ng submodule.
it's a monorepo on pub workspaces, so pub get at the root installs deps for every package.
telegram api keys never go into the repo. grab your api_id and api_hash at my.telegram.org, copy config/telegram.example.json to config/telegram.json (it's gitignored) and run:
cd packages/app
fvm flutter run -d macos --dart-define-from-file=../../config/telegram.json
release builds take the same values from the repo secrets TELEGRAM_API_ID and TELEGRAM_API_HASH.
prs are welcome. read CONTRIBUTING.md first: we use conventional commits and semver, the changelog is generated from commit messages. be nice, see the code of conduct. vulnerabilities go privately, see SECURITY.md.
| workflow | runs on | what it does |
|---|---|---|
ci.yml | push to main, prs | dart format, flutter analyze, flutter test, then release builds for macOS, windows and linux |
pr-title.yml | prs | checks that the pr title follows conventional commits |
release-please.yml | push to main | keeps a release pr with the next version and CHANGELOG.md up to date, merging it tags v* and starts the release |
release.yml | v* tag, release pr merge | builds all three platforms with keys from secrets and attaches the archives to the github release |
plugin_host.yml | changes to the plugin packages | builds quickjs, runs the plugin host tests on all three platforms and tests the plugins screen |
tdlib.yml | tdlib version change, manual | builds a universal libtdjson.dylib for macOS and publishes it to the tdlib-<version> release |
icon is a white speech bubble with an m on raspberry. the neon wordmark is promo only: readme, website, channel. the app itself has no neon.
| color | light | dark |
|---|---|---|
| default accent | ||
| raspberry accent (optional) | ||
| outgoing bubbles, raspberry theme | ||
| neon, promo only |
accent is system blue by default, raspberry is a toggle in settings. icon sources are in docs/assets.
design/ has the sources of the interactive mockups: main window, chat media and files, plugins, command palette, settings. each one switches between english and russian. they're in the design canvas format (.dc.html) so a plain browser won't open them.