Compare commits

...
Sign in to create a new pull request.
Author SHA1 Message Date
aae9bf9655
bump gomuks 2026-11-11 00:20:46 -05:00
1691fa981a
bump gomuks vendorHash 2026-11-11 00:00:32 -05:00
393d03d1b7
bump gomuks 2026-11-10 23:57:32 -05:00
c5cc5a052f
bump gomuks 2026-11-10 20:20:53 -05:00
11d74b2b2d
Revert "bump gomuks, drop explicit goolm tags"
This reverts commit 69c392a51f.
2026-11-10 19:59:42 -05:00
69c392a51f
bump gomuks, drop explicit goolm tags 2026-11-10 19:57:01 -05:00
1689cb1007
follow nixpkgs properly 2026-11-10 19:25:20 -05:00
2d8cd4eff2
fix use after dispose error from videos
Fixes #169
2026-11-10 19:21:29 -05:00
7b542d8d1e
fix android builds in devshell 2026-11-10 19:02:28 -05:00
f106db5948
run e2e flow on forgejo 2026-11-10 18:43:15 -05:00
af99de75da add e2e testing (#167)
Reviewed-on: Nexus/nexus#167
2026-11-10 18:29:02 -05:00
f1f0fea114
update webcrypto gitHash for nix package 2026-11-09 23:44:06 -05:00
a4141de01d
use webcrypto from main 2026-11-09 23:24:51 -05:00
ab3b9cc83f
set reaction tooltip triggerMode to manual 2026-11-09 17:58:25 -05:00
ffbb0ad9e2
make hovering a reaction show its shortcode 2026-11-09 17:31:19 -05:00
d5f29dc344
reorganize and rename widgets 2026-11-09 17:25:02 -05:00
05d25869ef
add reactions popover
Fixes #168
2026-11-09 17:14:46 -05:00
a09ae01b4e
fix up matrix:u links 2026-11-09 15:48:10 -05:00
8aada9a895
add per-room notif overrides
Fixes #163
2026-11-09 15:40:17 -05:00
a5711d2ded
show sizes for message images 2026-11-09 12:46:08 -05:00
ecac985d90
fix timeline weirdness with zero extents 2026-11-09 12:03:52 -05:00
272241f338
show filesize on audio and video renderers
Fixes #164
2026-11-09 11:37:50 -05:00
8692527105
add room ID to room summaries
Fixes #165
2026-11-09 11:32:22 -05:00
ac31fbb74d
timeline fixups 2026-11-09 10:58:08 -05:00
c658034d3b
small cleanup to player controls 2026-11-08 14:11:01 -05:00
995afe1412
clean up audio players 2026-11-07 22:40:56 -05:00
bf2aa50556
Reapply "add timeline debugPrints"
This reverts commit d1aa91fbbd.
2026-11-07 16:26:17 -05:00
d1aa91fbbd
Revert "add timeline debugPrints"
This reverts commit 1da836e20d.
2026-11-07 16:23:15 -05:00
274256dfe4
always show jump to bottom when theres a contextual event 2026-11-07 16:22:53 -05:00
1da836e20d
add timeline debugPrints 2026-11-07 15:59:21 -05:00
e609bcebcd
prepare v1.1.0-alpha1 2026-11-07 13:03:00 -05:00
bf8490896c
clean up thread timestamps 2026-11-06 12:36:27 -05:00
a229fcc598
add threads button back to appbar, hide close button on linux mobile mode 2026-11-06 12:30:20 -05:00
06ba23d3c0
add some more safety checks to composer 2026-11-06 10:45:53 -05:00
dbc42b0ec2
better UX for gomuks built-in commands
Fixes #157
2026-11-06 10:41:19 -05:00
29840d595a
fix weird focus issues with android OSK 2026-11-06 10:08:04 -05:00
5eed03c10e
make thread roots more distinguishable, and always show them even when redacted 2026-11-06 09:46:59 -05:00
ee28ddeddd
tweak minimum size 2026-11-06 09:46:00 -05:00
b29f801f37
Revert "prepare v1.1.0"
This reverts commit d61de252fb.
2026-11-05 23:52:47 -05:00
d61de252fb
prepare v1.1.0 2026-11-05 23:37:18 -05:00
a701bc6413
some small read receipt fixes 2026-11-05 23:33:04 -05:00
545fdd1f6b
clamp shown read receipts to at least 1
fixes weird error when rotating on directory page
2026-11-05 23:29:10 -05:00
4061b7b51e
fixes for some overflows on reply previews 2026-11-05 23:14:30 -05:00
b5fe2d4967
update gomuks vendorHash 2026-11-05 23:05:17 -05:00
ea29889e5c
tweak memory management 2026-11-05 20:51:28 -05:00
e899bb3929
keep message drafts on room switches
this is for you courge
2026-11-05 20:44:13 -05:00
7f7bdbf525
add thread support
Fixes #129
2026-11-05 19:14:46 -05:00
47645ea327
say "Redacted event" instead of "Unknown event type" for previews of redacted events 2026-11-04 12:48:29 -05:00
e382499a2a
add room directory support 2026-11-04 12:43:01 -05:00
033c7f9c05
use the correct font for timestamps 2026-11-03 23:56:15 -05:00
256e5fadbe
only show hide option for local events 2026-11-03 23:40:18 -05:00
39b8242867
set branch in .gitmodules
Helpful for updates.
2026-11-03 23:18:35 -05:00
28ba67cb59
update gomuks vendorHash 2026-11-03 21:27:46 -05:00
a0605a3617
Add room upgrades
Fixes #155
2026-11-03 21:13:27 -05:00
6d9a8e812b
bump gomuks 2026-11-03 20:06:51 -05:00
ecc4618ccd
add support for publishing rooms to the room directory
Part of #134
2026-11-03 17:50:26 -05:00
b201b1159e
fix regression in space edge logic
This bug caused space edges to clear sometimes.
2026-11-03 17:14:14 -05:00
029efe7c0a
add tombstone support
Fixes #147
2026-11-03 16:53:28 -05:00
522df86976
fix android build 2026-11-03 16:21:11 -05:00
ff9166966d
bump avif_native hashes 2026-11-03 15:54:41 -05:00
20eed13884
Add weighted search
Fixes #74
2026-11-03 15:50:46 -05:00
b6c6ac35d9
bump deps 2026-11-03 15:39:11 -05:00
a8e045bb3a
bump window_manager 2026-11-03 15:32:54 -05:00
b154b4ee2e
add GomuksEvent model 2026-11-03 15:16:38 -05:00
b4d5a632dd
extract adaptive sheets into their own library material_adaptive_sheets 2026-11-03 14:53:53 -05:00
2580cc8c1c
try to fix disposed errors when ending poll 2026-11-03 14:26:53 -05:00
2fc5a9bf85
make both HTML and plaintext links be styled the same way 2026-11-03 14:23:23 -05:00
8650c44266
add internal gomuks command support 2026-11-03 14:16:09 -05:00
3fc33a5ac9
Add MSC4391 support
Fixes #133
2026-11-03 13:12:58 -05:00
f35f715b81
don't try to download media for account switcher when logged out 2026-11-02 17:55:33 -05:00
e398043a49
allow editing in/out attachments from messages 2026-11-02 17:14:06 -05:00
e9b009d1b9
refactor to use mutations where helpful 2026-11-02 17:06:01 -05:00
641341ed90
Add account switcher
Fixes #146
2026-11-02 17:00:54 -05:00
3a8d977f11
add m.location support
Needs cross-platform testing. Currently only tested on Android.
2026-11-02 15:02:49 -05:00
979068fc3a
Add block button to profiles
Fixes #152
2026-11-02 12:44:41 -05:00
b55a6e0e83
allow viewing space timelines
Fixes #139
2026-11-02 12:30:04 -05:00
7007c9af89
allow adding / removing rooms from a space
Fixes #140
2026-11-02 12:21:58 -05:00
f6aaf49164
add poll support
Fixes #130
2026-11-02 12:03:52 -05:00
40f5d0f459
new linkify handling
Should fix mentions in non-HTML messages
2026-11-01 16:42:23 -05:00
bcb0c57015
allow colons in search regex 2026-11-01 12:48:32 -05:00
45b3ec10bf
show senders for both messages and stickers in reply previews 2026-11-01 12:44:52 -05:00
7baf56adef
stickers replace composer, instead of sending immediately
Fixes #153
2026-11-01 12:39:14 -05:00
51e3fe1007
add matrix: URI deeplinking
Fixes #148

Needs cross-platform testing, currently only tested on Android.
2026-11-01 11:52:13 -05:00
9e1d2f6921
fix search text being stripped when at end of message
using custom fork of fluttertagger for now
2026-10-31 15:33:30 -04:00
c9172e92eb
add push rule settings
Fixes #126
2026-10-31 15:22:13 -04:00
cb983701ca
make sdk bound less strict 2026-10-28 10:47:17 -04:00
285e6ad76a
check that formattedBody exists before rendering a message as HTML
In case people send HTML messages without HTML, which they do for some reason.
2026-10-26 23:54:28 -04:00
cd60163caf
update gomuks vendorHash 2026-10-26 17:35:52 -04:00
a2638d5c82
bump gomuks, use new pause/resume commands 2026-10-26 17:32:06 -04:00
f971c50df0
use a text span with a recognizer instead of a WidgetSpan
Fixes displaynames not ellipsising properly
2026-10-26 12:45:54 -04:00
1efbc131b4
auto write desktop file on debug mode install on Linux
Fixes #150
2026-10-26 12:13:06 -04:00
4b329b4c6f
add settings for image packs
Closes #131
2026-10-26 12:05:45 -04:00
2041b81141
add toJson to all content models
Fixes a regression from the primary constructor content migration
2026-10-25 18:30:28 -04:00
a3ef4f8135
fix invalid power level creation
oops, misread spec and now this breaks rooms on Synapse
2026-10-25 17:04:21 -04:00
0a09a4ee0a
general cleanups and mounted guards 2026-10-24 12:02:23 -04:00
62e200f305
fix typing indicators not ellipsizing 2026-10-24 11:30:14 -04:00
dd01ad9d74
migrate Content classes to primary constructors
The Riverpod bug preventing us from doing this has been fixed.
2026-10-23 20:44:29 -04:00
853116ab2f
treewide cleanups 2026-10-23 20:26:37 -04:00
53d9c2b1e6
make enums fall back to unknown or null where possible
Futureproofing.
2026-10-23 20:12:54 -04:00
401b527714
ignore invalid account data 2026-10-23 20:05:23 -04:00
3754bc2feb
allow sending emoji/stickers from emote packs 2026-10-23 18:16:45 -04:00
868023a4a1
avoid un-needed reloads for diffs 2026-10-23 17:02:41 -04:00
9e6951818a
hide server ACL events from timeline by default, introduce setting to show them 2026-10-23 14:29:37 -04:00
0743c4cfc6
reorder appearance settings 2026-10-23 14:26:26 -04:00
6336764da0
add power level groups 2026-10-23 12:24:22 -04:00
3a39f1c5ac
more intuitive permissions in encrypted rooms 2026-10-23 12:12:20 -04:00
6e2d56ec75
add diffing for a lot of events 2026-10-23 12:01:38 -04:00
4e140e9fc7
add pinned event and server ACL diffing 2026-10-23 11:28:44 -04:00
e5dd53ed6c
tweak color picking algorithm for power levels, and introduce setting for per PL or per user colors 2026-10-23 10:23:49 -04:00
c0f4c053b0
Make displayname colors based off of power level
Fixes #128
2026-10-23 01:10:01 -04:00
ee36a9b1c8
Revert "use media_kit from main"
This reverts commit f5371382d7.
2026-10-23 00:36:31 -04:00
f5371382d7
use media_kit from main
Has some perf improvements, especially for Linux
2026-10-23 00:28:43 -04:00
2937c241e0
release v1.0.0 2026-10-22 22:10:33 -04:00
9dcddb3fbe
Revert "quick smoketest of macos"
This reverts commit 3014a9d029.
2026-10-22 22:08:59 -04:00
3014a9d029
quick smoketest of macos 2026-10-22 21:41:31 -04:00
4a9f151d92
don't watch entire room in room settings
performance improvement
2026-10-22 21:36:16 -04:00
d4ae5ebccf
drop unstable timezone key support 2026-10-22 21:32:19 -04:00
850bd33b18
fix maxMagnitude value for power levels
(oops thats a xor not an exponent operator)
2026-10-22 21:28:51 -04:00
8fbfcde9c5
add profile editor
Fixes #12
2026-10-22 21:20:13 -04:00
e0b5dc58d0
gate android branches of window_manager 2026-10-22 17:31:43 -04:00
ffbf2722f7
turn down minimum size
too large for linux mobile rn
2026-10-22 16:33:02 -04:00
3e1552f246
don't open media if context not mounted 2026-10-22 16:09:27 -04:00
44a1ec667e
switch to new window_manager from main 2026-10-22 16:06:28 -04:00
479279b68e
bring back padding for filters on member list 2026-10-22 15:33:29 -04:00
b0dd452926
add power level room settings 2026-10-22 15:29:02 -04:00
fcfe4eed1e
more correct fallback for unknown join conditions 2026-10-22 14:32:58 -04:00
b390dbbbe1
add room access settings 2026-10-22 14:22:54 -04:00
8e51852ae3
add general room settings 2026-10-22 11:29:19 -04:00
48c04d9b3e
make swipe from right open member list 2026-10-22 10:53:07 -04:00
7f30150e95
make theme's platform Android when Linux Mobile Mode is on
Allows for swiping drawers closed
2026-10-22 10:37:31 -04:00
c8e1aef74b
show mutual rooms in user popover
Fixes #97
2026-10-22 10:25:50 -04:00
5ee3449f02
bump gomuks 2026-10-22 09:56:52 -04:00
1715ee785e
make names in typing indicators clickable 2026-10-21 23:01:22 -04:00
e38307657d
Read receipt support
Fixes #93
2026-10-21 22:58:06 -04:00
e14ab3e708
use *Async methods from gomuks
Performance improvement due to not needing as many Isolates.
2026-10-21 22:57:26 -04:00
f5645db6ea
only reserve space for jump to bottom when it exists 2026-10-21 15:09:41 -04:00
0fcbc275cd
add typing indicators
Fixes #92
2026-10-21 15:07:02 -04:00
a54004736b
add event search
Fixes #77
2026-10-21 13:31:01 -04:00
427e06be3e
add knock support
Fixes #123
2026-10-21 12:32:02 -04:00
a1a15af30d
use dot shorthands for default immutable collections where possible 2026-10-20 18:23:41 -04:00
800fb5566d add a global toggle to hide membership events (#142)
fixes #141

Co-authored-by: seres <seres@seres.eu.org>
Reviewed-on: Nexus/nexus#142
2026-10-20 18:15:01 -04:00
80197aff00
add keyboard inset workaround to MainActivity
Should be reverted once https://github.com/flutter/flutter/issues/191156 is fixed
2026-10-20 15:17:34 -04:00
78162efbde
move MainActivity to correct directory 2026-10-20 15:15:42 -04:00
a2906746b9
release v1.0.0-alpha5 2026-10-19 21:18:33 -04:00
6659f21ceb
apply SafeArea on showAdaptiveSheet
This fixes actions being cut off when using button navigation.
2026-10-19 21:18:03 -04:00
a065b823bb
remove outdated bundled-emoji reference 2026-10-19 21:10:05 -04:00
765e96cce4
refactor and improve notification handling 2026-10-19 21:10:05 -04:00
9cf16db669
use webcrypto fork to fix macOS builds 2026-10-19 20:39:33 -04:00
2c8a4da2a8
Reapply "override webcrypto to a version with build hooks"
This reverts commit eca2b0b558.
2026-10-19 20:02:34 -04:00
cb426cd27e
add fallback emoji font list until flutter 3.50 releases 2026-10-19 19:39:09 -04:00
bfd259543d
don't bundle an emoji font
Might need reverts after testing.
2026-10-19 18:19:05 -04:00
9f0b80072d
pause sync when app is backgrounded 2026-10-19 17:40:57 -04:00
b6ee5aec64
use system emoji before bundled
Needs testing on:
- Android
- Windows
- MacOS
To make sure that it doesn't break stuff.
2026-10-19 10:38:30 -04:00
deac9ef24e
handle permission denials more gracefully 2026-10-18 16:36:36 -04:00
e24e99fd8e
slight improvements to windows and darwin notifs 2026-10-18 16:14:00 -04:00
4580110da0
update gomuks vendorHash 2026-10-18 16:04:56 -04:00
d1724932b2
clean up and improve notifications
Thanks to Gomuks' new handling, we have sender displayname and avatar, and can use android's conversation notifications.

On other platforms, we just append sender name to the body, bolded if possible.

This also improves the logic on when to send notifications, as we drop notifs where `response["notification"]` is null.

We also now correctly set if notifications should play a sound or not, based on `PushNotification.sound`.

`PushNotification.image` handling might come sometime in the future, but it seems hard on Android.
2026-10-18 16:01:37 -04:00
a6fe80fea2
split APKs per abi and only upload arm64 APK 2026-10-17 16:19:27 -04:00
9f45cbc1e7
add warning when user has cross signing but not secret storage 2026-10-17 16:12:10 -04:00
eca2b0b558
Revert "override webcrypto to a version with build hooks"
This reverts commit 4e6ba571fc.

Due to an upstream bug, this broke Linux aarch64 builds, as well as MacOS builds.
2026-10-17 11:53:23 -04:00
4e6ba571fc
override webcrypto to a version with build hooks 2026-10-17 11:37:51 -04:00
200e03f082
noheic always 2026-10-17 11:21:20 -04:00
8180338d99
use another avif library that works on aarch64-linux 2026-10-17 11:18:23 -04:00
72c5e7d819
add errorBuilder to reactions 2026-10-17 10:24:30 -04:00
254b7e134f
release v1.0.0-alpha4 2026-10-16 22:14:15 -04:00
ef25e765d4
handle events_decrypted 2026-10-16 22:12:15 -04:00
58a27fdd9e
tiny cleanup in avif decoding 2026-10-16 22:00:00 -04:00
6d42477041
add support for avif images
Fixes #138
2026-10-16 20:35:42 -04:00
2f17f5b6c6
add swipe to reply
Fixes #90
2026-10-16 18:08:42 -04:00
1380233f2e
release v1.0.0-alpha3 2026-10-16 17:20:36 -04:00
a3a3781252
open sidebar on homepage pop 2026-10-16 17:17:19 -04:00
81851bdc42
fix no room selected after leave / init 2026-10-16 17:13:25 -04:00
f19a51939c
small cleanups 2026-10-16 17:06:22 -04:00
0ad85f24d5
Add support for downloading media
Fixes #85
2026-10-16 17:05:26 -04:00
1c2ba2971b
release v1.0.0-alpha2 2026-10-16 11:23:14 -04:00
fb0af571ed
fixup controls on narrow videos 2026-10-16 11:14:07 -04:00
9cd43f4e3c
only start timer to end highlight after scroll complete 2026-10-16 11:08:24 -04:00
0fa0f57738
fix ctrl+v text paste not working 2026-10-16 11:02:23 -04:00
00f22d46b7
slight cleanups 2026-10-16 10:56:55 -04:00
23046f08a9
add support for initializing and resetting crypto identity
Fixes #137
2026-10-16 10:49:04 -04:00
784e5254e2
fixup credits header on readme 2026-10-15 23:41:40 -04:00
7193ac0dba
remove progress list and disclaimer for readme
Progress list has been replaced by issues, now there aren't too many unchecked boxes.
2026-10-15 23:40:33 -04:00
7ab4b5e59f
update screenshots 2026-10-15 23:28:08 -04:00
c23dc19c6e
update readme progress list
[skip ci]
2026-10-15 23:03:48 -04:00
0b79aac7af
update readme for release
[skip ci]
2026-10-15 23:01:47 -04:00
e4f290eaa6
release v1.0.0-alpha1 2026-10-15 22:57:36 -04:00
d309754c60
fix nix build 2026-10-15 22:57:36 -04:00
a5dedb0d38
add Not yet implemented warning to discover / directory page 2026-10-15 22:41:20 -04:00
659e76b8f8
add slight padding above browse space fab 2026-10-15 22:40:55 -04:00
ab3eda0beb
show topics and summaries for spaces 2026-10-15 22:39:37 -04:00
b71a7f0bd6
Show space hierarchies
Fixes #83
2026-10-15 22:34:27 -04:00
8d944831f5
treewide: small refactors 2026-10-15 20:10:44 -04:00
9117663c48
mass migrate to adaptive sheets 2026-10-15 20:06:37 -04:00
ba258c2fcd
invite-related fixups 2026-10-15 20:01:24 -04:00
485383e99c
fixup weird behavior when leaving spaces 2026-10-15 19:50:35 -04:00
ed84410039
add support for creating rooms
Fixes #81
2026-10-15 19:49:04 -04:00
df592b3f38
add better OAuth error
Fixes #88
2026-10-15 18:30:12 -04:00
d47c4ae15c
update gomuks vendorHash 2026-10-15 15:30:33 -04:00
d308ef98cb
small fixups
Fixes #67
2026-10-15 15:13:31 -04:00
f082a75d9c
run GomuksStart on an isolate 2026-10-15 14:25:45 -04:00
36f61a62d8
allow pasting attachments from keyboard
Closes #55
2026-10-15 13:56:10 -04:00
27137c488d
replace media_kit's video widget with a custom impl
Fixes #48

This helps Linux touchscreen devices like Linux phones, where the old widget didn't work correctly.
2026-10-15 10:53:30 -04:00
ce5c7b972b
make user sheets popovers on desktop 2026-10-15 10:25:20 -04:00
76d78596cd
show bottom sheets / dialogs / menus based on screen size
Fixes #76
2026-10-15 10:20:27 -04:00
ed2d08ed40
fixup showing an error when opening info dialogue on sync waiting 2026-10-15 10:02:43 -04:00
24e516e6dd
store related events for mentions 2026-10-15 00:44:08 -04:00
66a437094a
show badges totaled in more areas 2026-10-15 00:42:56 -04:00
d37ec2878b
add invite support
Closes #82
2026-10-15 00:35:38 -04:00
dbf30c3706
fix historical event jumps
Fixes #118
2026-10-14 23:52:16 -04:00
2d619bf1ad
properly order historical timelines
Fixes #117
2026-10-14 23:37:53 -04:00
07700c1eff
add syncing waiting / error / failed indicator 2026-10-14 23:21:31 -04:00
a5fef138dd
add support for altering room ordering
Fixes #115
2026-10-14 22:58:10 -04:00
7353955d4e
add more guidelines to DEVELOPMENT.md 2026-10-14 17:04:05 -04:00
012ecd9249
treewide sweepfixes 2026-10-14 17:01:39 -04:00
8fda43ccf8
Push sidebar if needed and scroll to notif when tapped
Fixes #116
2026-10-14 16:51:14 -04:00
3a33bf7bfe
Allow swapping UnifiedPush distributor
Fixes #120
2026-10-14 16:41:01 -04:00
9237a3dbed
use upstream nix2flatpak
All PRs have been merged.
2026-10-14 16:27:27 -04:00
30a5fa100c
gracefully catch errors when parsing membership state 2026-10-12 10:36:41 -04:00
f198888635
bump deps
fixes #119
2026-10-11 13:43:13 -04:00
be945031cd
bump nix2flatpak 2026-10-11 12:48:53 -04:00
ad525b338c
fix state events not wrapping
Why did it do this ??????
2026-10-08 10:12:43 -04:00
0010160714
fix bigEmoji causing an overflow in replies 2026-10-08 10:08:33 -04:00
f741a6790d
update gomuks vendorHash 2026-10-06 19:27:37 -04:00
7be1dfe0bc
add inviting from room menu 2026-10-06 19:23:00 -04:00
08dcfdab75
fixup topic alignment for short topics 2026-10-06 10:26:59 -04:00
c81000d6c6
slightly improve bitfield handling for UnreadType 2026-10-05 20:16:01 -04:00
3c6c610f7c
improve UP timeout behavior
Hopefully more reliable.
2026-10-05 17:00:56 -04:00
61c5aa94c2
add timeout for UP reg 2026-10-05 15:07:22 -04:00
02ba9180db
fix error when opening settings during init sync 2026-10-05 14:23:06 -04:00
3c6f9f5da2
allow adding minimized button on all desktop platforms
Didn't mean to limit that to Linux
2026-10-05 12:35:18 -04:00
1d4af179d4
try opting out of predictive back
Needed until flutter bug is fixed
2026-10-05 12:23:08 -04:00
9974a6c225
add enableOnBackInvokedCallback true
Hopefully fixes drawers not popping?
2026-10-05 12:01:13 -04:00
9c83ae573a
add setting for showing minimize button 2026-10-05 11:26:26 -04:00
66cfb0e2c6
fix wrapping issues on event previews 2026-10-05 11:16:11 -04:00
02c486e1b3
make it more clear which methods free the buffer 2026-10-05 10:11:16 -04:00
b694da31f9
Revert "swap to SystemNavigator.pop from exit"
This reverts commit a86748e85f, as it was causing issues on Windows.
2026-10-05 10:10:47 -04:00
f931615890
fix scrollview not sticking to bottom if composer sends multiline messages 2026-10-04 17:15:23 -04:00
ae8fa17db3
mark homeserver url field as a .url keyboardType 2026-10-04 16:45:19 -04:00
a63f4674fd
make composer auto capitalize sentences 2026-10-04 16:06:54 -04:00
a46d93dfc5
filter shown recent emoji to valid emoji 2026-10-04 13:01:06 -04:00
294723fdfb
tweak reply sizing more 2026-10-04 11:22:14 -04:00
5e3c7ffa68
alter text alignment and icon sizes treewide 2026-10-04 11:16:39 -04:00
1fd9810b83
fall back to filename when body is empty 2026-10-04 10:25:29 -04:00
d119370816
tweak padding and sizing in reply renderer 2026-10-04 10:08:17 -04:00
ffaa516dcd
always make event previews two lines for non-state events 2026-10-04 00:32:20 -04:00
e480e6193b
refactor and improve room list 2026-10-03 21:58:01 -04:00
e41efd92c1
turn up verify page horizontal padding
looks a little nicer
2026-10-03 21:32:53 -04:00
b253fc1d96
change font size of tagline on select server page 2026-10-03 21:05:42 -04:00
967fe66a1b
remove unredacted from login page for now 2026-10-03 21:01:20 -04:00
658fa562cf
await route.completed before assuming settings are popped 2026-10-03 20:58:11 -04:00
fe33ae2e97
lower insetPadding for verify dialog 2026-10-03 20:39:00 -04:00
bcb085c035
scroll chat by composer height change delta
slightly evil but works
2026-10-03 20:35:44 -04:00
eae79d943d
make verify dialog scrollable 2026-10-03 20:15:17 -04:00
bdac4a11d7
default to empty via when none are provided
fixes joining with only a room alias
2026-10-03 14:44:22 -04:00
2ed2443298
make composer revert to unedited content when dismissing edit, plus more fixes 2026-10-03 14:40:19 -04:00
7f71adab4c
fix double watch in composer 2026-10-03 13:59:11 -04:00
0a3ec830a3
stop event preview resizing itself on load
Fixes #109
2026-10-03 13:50:46 -04:00
650f1ac8e4
allow hiding gomuks internal messages 2026-10-03 13:24:47 -04:00
af5f238db0
stop complaining at me formatter 2026-10-03 12:34:56 -04:00
006008f61d
rename AvatarOrHash.height to be more accurate 2026-10-03 12:25:22 -04:00
f23a29e7c1
tweak MessageDisplayname fallback state 2026-10-03 12:23:33 -04:00
493776e3dd
clear init complete state on logout 2026-10-03 11:56:17 -04:00
25afcf4acd
fix silent useless error during verify 2026-10-03 11:53:32 -04:00
e54b059bc9
fix not in range error when logging out 2026-10-03 11:44:35 -04:00
b8b074b229
bump gomuks 2026-10-03 11:26:18 -04:00
9ffad93469
cleanup logic in event renderer 2026-10-03 01:22:03 -04:00
3875c3a14a
Add a setting (off by default) for showing all rooms in home
Fixes #107

@LogN review
2026-10-03 01:15:11 -04:00
a86748e85f
swap to SystemNavigator.pop from exit 2026-10-03 01:01:59 -04:00
19363baa8d
fixup issues in join dialog
Fixes #112
2026-10-03 00:53:05 -04:00
41bdb04b72
make chat follow new messages when scrolled to bottom
Fixes #106
2026-10-02 19:57:48 -04:00
8da46dffe4
allow hiding client stickies
Fixes #105
2026-10-02 17:01:25 -04:00
49f2dc55b8
update platform support in readme 2026-10-02 12:13:26 -04:00
f9ff04405f
mark nix package as broken on darwin 2026-10-02 12:09:55 -04:00
ecb965994a
small tweaks to room list 2026-10-02 11:36:03 -04:00
36917bbea5
fix localContent being outdated for edits 2026-10-02 11:32:10 -04:00
684d6bad82
only pop from notifications list if Navigator reports canPop 2026-10-02 11:22:03 -04:00
45d69b0b9f
move NotificationsPage into sidebar via NavigationBar 2026-10-02 11:19:46 -04:00
3b2cf6b2a4
move padding for user sheet inside the scrollview 2026-10-01 18:29:03 -04:00
a61cac130b
make user bottom sheet scrollable 2026-10-01 18:22:02 -04:00
ec30adc0e3
allow sending media even when last event was an edit 2026-10-01 18:12:59 -04:00
a63d182c50
show git commit in about dialog 2026-10-01 16:15:36 -04:00
64a8edda7d
don't make composer buttons narrow
It doesn't actually change the hitbox? Only the shape of the InkWell.
2026-10-01 15:27:22 -04:00
2e85b26511
make PinnedEventsController expose IList of eventRowIds 2026-10-01 12:26:12 -04:00
a91b45be31
make send button narrow 2026-10-01 12:23:13 -04:00
d9062f68c4
bump nix2flatpak, use updated runtime 2026-10-01 12:07:24 -04:00
b3b873ffce
hardcode padding in order to make PopupMenuButton actually .narrow
This is needed because of a flutter bug, see https://github.com/flutter/flutter/issues/193656.
2026-10-01 11:33:10 -04:00
ab69bfe553
bump lock 2026-10-01 10:31:41 -04:00
98108d013e
use m3e iconbuttons 2026-09-30 11:47:40 -04:00
bdf8fc6ce1
make inline codeblocks actually inline 2026-09-30 11:16:03 -04:00
b738c1d0e0
Bump gomuks
Fixes #104
2026-09-30 09:51:52 -04:00
93b832839b
only add non-free text reactions to recent 2026-09-29 21:40:08 -04:00
301bcd94f2
fixup jumps from notifs sometimes not working 2026-09-29 20:47:20 -04:00
da7f2dcf4e
change how cross-room jumping works 2026-09-29 20:23:16 -04:00
b92aaed610
fixup notif jumping 2026-09-29 20:11:57 -04:00
1e4aab08ad
clean up and fix up jumping 2026-09-29 19:52:11 -04:00
1c4bf99be2 Add support for jumping to event links (#103)
Fixes #78.

Reviewed-on: Nexus/nexus#103
2026-09-29 17:00:43 -04:00
597112f5d3
add room summary image for TWIM
Yes, I'm preparing rather early this week :p
2026-09-29 16:05:28 -04:00
c8b9654219
Clickable room links
Fixes #80
2026-09-29 16:02:25 -04:00
9bc2d9955a
make relatedEvent store a rowId 2026-09-29 15:17:35 -04:00
ead463262c
make NotificationsController work off of rowIds 2026-09-29 15:10:54 -04:00
281bab0202
Add room preview dialog
Closes #79
2026-09-29 13:55:17 -04:00
9e024fb6f2
only mark as read when fully at bottom 2026-09-29 10:46:15 -04:00
a0036bdda3
watch clientSticky in RoomChatController 2026-09-29 10:24:45 -04:00
bd7cd0b10c
fixup edit handling 2026-09-29 09:45:51 -04:00
ec0934110f
swap msystem to avoid warning on windows build 2026-09-28 23:01:50 -04:00
1cfda9c68b
bundle more DLLs with windows build 2026-09-28 22:03:21 -04:00
1758815cc9
bundle all fonts
Should fix #57
2026-09-28 20:43:50 -04:00
9f4702b9d1
remove SelectableRegion as it is causing issues 2026-09-28 19:32:18 -04:00
195d212d68
improve speed of state merge 2026-09-28 18:29:46 -04:00
a698cf8c28
small cleanups 2026-09-28 18:20:36 -04:00
338d5dfee9
clarify flatpak updates 2026-09-28 17:56:13 -04:00
efa3681816
improve install docs, incl flatpak repo and nixos module 2026-09-28 17:53:38 -04:00
3824ca1c13
remove metadata
It is now statically hosted by caddy
2026-09-28 17:45:01 -04:00
01566894a6
add flatpak repo
Hopefully this works
2026-09-28 16:48:18 -04:00
64e548f0c5
fix hash for xdg_desktop_portal
Fixes nix build
2026-09-28 14:36:27 -04:00
4bde7875fb
up-to-date xdg portals
Fixes #101
2026-09-28 14:32:18 -04:00
07f8e58a4c
named records, small fixes to last commit 2026-09-28 13:17:15 -04:00
a220e27877
Make RoomChatController only return IList of eventRowId
Fixes #102
2026-09-28 12:46:00 -04:00
5304f22456
workaround for reactions not updating on historical timeline 2026-09-28 11:03:55 -04:00
e5b39507c8
Jump to current timelime when scrolled to bottom of historical timeline
Fixes #100.
2026-09-28 09:55:08 -04:00
d37538b69f
gate pop behind canPop 2026-09-28 09:49:20 -04:00
e300f4efc9
small fixups 2026-09-26 21:11:11 -04:00
bab699658f
pop sidebar before pushing notif page 2026-09-26 20:32:44 -04:00
1c1f585362
add JumpToEventController to allow jumping to events from the NotificationsPage when it has been pushed from the NotificationController 2026-09-26 19:37:47 -04:00
c90a1c41b0
working jumps from notif page
Doesn't work from notif page pushed from notif controller
2026-09-26 19:13:30 -04:00
9f070fcdba
reorganize pages into being under widgets 2026-09-26 18:06:51 -04:00
d712bb3193
tweak scroll behavior 2026-09-26 14:52:24 -04:00
3217c17ea0
don't depend on SuperSliverList for scrolls 2026-09-26 13:58:30 -04:00
031fbe326c
change highlight timing 2026-09-26 13:42:31 -04:00
0149aa2f84
fixup jumping to pins 2026-09-26 13:30:39 -04:00
a1efdb0f46
check off jumping on readme 2026-09-26 13:15:48 -04:00
389b65ae61 add support for jumping to out-of-context events (#95)
Fixes #84.

Reviewed-on: Nexus/nexus#95
2026-09-26 13:03:16 -04:00
3429a3ed98
add twim image 2026-09-25 10:20:53 -04:00
7ab92f76bf
fix for janky scrolling when tapping reply with SuperSliverView
I don't like this but it does work.
2026-09-24 22:46:48 -04:00
aecfac9533
free base before buffer 2026-09-24 22:20:31 -04:00
c7b89b8e56
small cleanups 2026-09-24 20:59:18 -04:00
721727d48c
small cleanups 2026-09-24 20:50:28 -04:00
004c3bcd0d
remove outdated error ignores
I believe some of these are fixed, if not they should be noisy so I notice them and can re-add
2026-09-24 20:38:30 -04:00
943cd85e22
treewide: ref.watch(ClientController.provider.notifier) -> ref.read 2026-09-24 20:35:20 -04:00
09904536e7
small fixups 2026-09-24 20:31:22 -04:00
856072e0b0
fixup! refactor chatview to have two sliver lists 2026-09-24 20:22:30 -04:00
110caff170
refactor chatview to have two sliver lists
Co-authored-by: Erwan Leboucher <erwanleboucher@gmail.com>
2026-09-24 20:02:23 -04:00
eeb2e2f54b
extract scroll helpers into their own hook 2026-09-24 18:10:30 -04:00
529a2e35c4
make buildEventOptions an extension 2026-09-24 14:41:13 -04:00
6ad4657d76
refactor chatview 2026-09-24 14:24:41 -04:00
38fd19ad1a
move isInBackground in main 2026-09-24 14:08:54 -04:00
0636366359
fixup errors caused by bump 2026-09-24 11:56:46 -04:00
efe9262a97
tweak timeout 2026-09-24 11:49:19 -04:00
2763a0fdf5
bump deps 2026-09-24 11:47:20 -04:00
a5da44fdea
more restrictive timeout on notification init 2026-09-24 11:42:57 -04:00
ccca02a0bc
Separate out GomuksListenerController from ClientController
Fixes #89
2026-09-24 11:03:16 -04:00
721349ca21
explicit listener for ClientStateController in notifs 2026-09-23 11:22:47 -04:00
5d994bf2bb
wait for metadata to come in on notif's rooms before sending them 2026-09-23 11:17:02 -04:00
a90bf00f18
dispose notif handler 2026-09-23 10:30:12 -04:00
f2efbbeb9f
fixup select 2026-09-22 20:48:59 -04:00
ed761d6071
gate selectable text behind mouse connected 2026-09-22 20:40:55 -04:00
8f35ea2435
Add "Copy Text" context menu option 2026-09-22 20:18:16 -04:00
023e75e063
always make events selectable (on mobile the long press overrides it) 2026-09-22 20:11:18 -04:00
4d0a4605d6
type contextMenuCallback 2026-09-22 19:57:23 -04:00
faa7292001
add codeblock copy button 2026-09-22 19:19:21 -04:00
027033ad9e
allow copying messages when on desktop without mobile mode on 2026-09-22 19:13:32 -04:00
ece3d16318
use dot shorthands in about dialog 2026-09-22 18:48:47 -04:00
5738239da2
fix name of ShowAboutDialog extension 2026-09-22 18:31:38 -04:00
a2791a6717
various small fixups 2026-09-22 15:53:37 -04:00
f910d87a23
don't require login for UP controller to finish init 2026-09-22 15:33:55 -04:00
f4142859ba
fallback isFocused to true 2026-09-22 15:05:57 -04:00
775c77194b
run in background properly on android 2026-09-22 15:02:30 -04:00
41806be9bf
More platform-independent approach to managing registered state 2026-09-22 14:34:08 -04:00
6e47594a91
fix race condition on startup 2026-09-22 11:36:29 -04:00
386b3ad1cf
inline the mention fetch 2026-09-22 10:37:49 -04:00
61f2aa7f2a
update gomuks vendorHash 2026-09-22 10:02:56 -04:00
0c660a98a7
just grab events out of get_mentions for now 2026-09-22 09:57:10 -04:00
09534a6775
use GomuksConfig 2026-09-22 09:53:00 -04:00
0cd815dc79
init ClientController before other providers 2026-09-21 23:03:57 -04:00
800ed0636d
bump nix2flatpak 2026-09-21 22:18:24 -04:00
e4cf2a837c
fixup login 2026-09-21 21:41:18 -04:00
11dca9bf14
seperate URI handler desktop file 2026-09-21 21:20:16 -04:00
436b8642b3
read not watch MultiProviderController providers
Fixes random loading animations
2026-09-21 19:27:10 -04:00
269d97be8f
bump nix2flatpak 2026-09-21 18:53:49 -04:00
43f70f35a3
bump nix2flatpak 2026-09-21 18:00:42 -04:00
92b148f5b6
gate registration behind not flatpak 2026-09-21 17:54:03 -04:00
00a42b5f1a
fixup flatpak build 2026-09-21 17:20:43 -04:00
700b4e720f
open notifications page on notif tap
please please please let me never touch c++ again i hate it

also the c++ got reformatted here but i dont really care
2026-09-21 16:56:12 -04:00
2a11bcb7e8
update hashes 2026-09-21 15:44:10 -04:00
fea39e4191
use xdg_desktop_portal over flutter_local_notifications on linux 2026-09-21 15:43:01 -04:00
deaf564c36
use portals for linux notifs 2026-09-21 14:16:29 -04:00
c0d14ac30e
don't write service by default 2026-09-20 17:27:45 -04:00
1a6a5c36ea
link to module from readme 2026-09-20 17:21:26 -04:00
35ef82accd
fixup module 2026-09-20 17:18:39 -04:00
f40dd22277
use mkEnableOption for enableNotifications 2026-09-20 17:14:56 -04:00
1cfea5a819
add nix module 2026-09-20 17:13:22 -04:00
b3023d8147
don't auto create dbus service 2026-09-20 17:00:10 -04:00
e8fb3a8523
use SharedPreferencesAsync to avoid race condition in Sharedprefs
This was so painful to debug...
2026-09-20 15:45:32 -04:00
0d1ace3fd0
add more logs for notifs 2026-09-20 13:41:22 -04:00
3d690c26d8
hopefully fixup UP on linux when backgrounded 2026-09-20 13:27:47 -04:00
3fee789c90
fixup flatpak perms 2026-09-20 00:07:47 -04:00
d7c64fea80
potentially fix notifs on flatpak 2026-09-20 00:04:50 -04:00
87e7e093f7
Revert "don't invalidate UP controller"
This reverts commit 73c4a7d07f.
2026-09-20 00:02:49 -04:00
8b7e29ae33
Set device name to "Nexus on $platform"
Fixes #86.
2026-09-19 22:41:13 -04:00
673c5bd894
fix memory leaks
Oops! They were pretty slow, but still adds up. This might fix the bug that was stopping Nexus from working on GraphineOS.
2026-09-19 21:13:03 -04:00
650c62fb99
update gomuks hash 2026-09-19 18:45:05 -04:00
4f3b77f9f3
set env for gomuks
Fixes #62
2026-09-19 18:41:09 -04:00
85bb653980
fix gomuks init on android / ios 2026-09-18 15:39:45 -04:00
a9d2ccbcd1
bump gradle 2026-09-18 13:02:40 -04:00
73c4a7d07f
don't invalidate UP controller 2026-09-18 10:57:16 -04:00
57f9498aa3
better wrapping behavior for timestamps on state events 2026-09-18 09:58:49 -04:00
cfab803fa0
show timestamps for state events 2026-09-17 23:21:33 -04:00
f23a35384d
nicer / less intrusive mention style 2026-09-17 14:27:51 -04:00
7f7fb451e6
Bump emoji picker to 1.1.1
Better performance now.
2026-09-17 12:09:16 -04:00
5d62e66cd9
remove duplicate "Windows EXE" entry in "Try it out" section of README
Thanks to @julian45 for spotting this!
2026-09-16 22:11:43 -04:00
009ba504e3
fixup logic for not init-ing UP
An XOR was never the right choice for this
2026-09-16 22:07:00 -04:00
30b922d390
enlarge emojis on emoji overlay 2026-09-16 22:03:42 -04:00
63183e0824
don't init UP on platforms other than Linux or Android 2026-09-16 21:59:55 -04:00
163947fc90
add emoji overlay 2026-09-16 16:52:58 -04:00
11457470a0
move around args to overlays 2026-09-16 16:30:15 -04:00
dca0b7dd7d
refactor overlay system 2026-09-16 16:27:10 -04:00
e5dc270f83
bump emoji picker 2026-09-16 16:27:07 -04:00
810a0b102b
add support for setting recent emoji 2026-09-16 15:46:51 -04:00
ec1603b828
add support for showing recent emoji 2026-09-16 15:18:41 -04:00
5acdbb5be0 Better emoji picker (#73)
Adds a better, custom, emoji picker.

Reviewed-on: Nexus/nexus#73
2026-09-16 14:47:46 -04:00
e21c9e8c22
make highlights work better for Notifications page 2026-09-12 09:52:01 -04:00
ea687471bc
Make TODO on notifications page more useful 2026-09-11 22:42:43 -04:00
8c440447f2
check off Notifications page in readme 2026-09-11 22:42:17 -04:00
8ebec15324
hide label whe not selected for filter 2026-09-11 22:41:38 -04:00
cd8d551e26
take notif filter out of card 2026-09-11 22:39:18 -04:00
118e5a5826
update readme for platform support to be more clear 2026-09-11 22:35:13 -04:00
6ca9b2a948
add notification page filter 2026-09-11 22:34:43 -04:00
23e01c7a0d
Notifications page
Doesn't yet allow for jumping to events
2026-09-11 22:03:42 -04:00
9e7fcdbef7
sticky -> clientSticky to avoid conflicts with sticky events 2026-09-11 19:50:29 -04:00
9507d69458
move windows warning in readme 2026-09-11 19:29:47 -04:00
13d90df226
remove un-needed overrides 2026-09-11 19:28:10 -04:00
e925f9657c
add needed permissions for UnifiedPush to nexus flatpak 2026-09-10 17:14:41 -04:00
b8882d6e48
mark off notification support as added, add notifications page todo 2026-09-10 17:06:14 -04:00
ff9bf3bec4 Push Notifications (#66)
Fixes #35.

Things to do:
- [x] Register with local distributor
- [x] Register with homeserver
- [x] Recieve messages
- [x] Show notifications
- [ ] Notifications page (could come later)

Reviewed-on: Nexus/nexus#66
2026-09-10 15:37:05 -04:00
6e42902322
run GomuksInit on an Isolate
Fixes #70
2026-09-10 15:32:30 -04:00
c105a6035c
use dot shorthands where possible in generate script 2026-09-10 15:21:53 -04:00
3d7ef9b32f
actually generate bindings
Yes `ffigen`, I did actually want you to generate the bindings, not a file consisting only of comments. Crazy, right?
2026-09-10 15:20:56 -04:00
51ef66174a
fix generate script to work with new ffigen 2026-09-10 15:15:12 -04:00
1efb68ebe0
bump deps, remove unwanted and now un-needed analyzer rule
Fixes #69
2026-09-10 15:09:47 -04:00
0a667fda0b
update gomuks vendorHash 2026-09-09 15:44:25 -04:00
da352cd035
cap max length of embeds 2026-09-09 15:37:41 -04:00
0201f71e5d
allow banning left users 2026-09-09 15:26:04 -04:00
4314c88d5c
fallback to empty profile if fetch fails 2026-09-09 15:25:10 -04:00
88cdcf9863
use compat bridge for settings sidebar 2026-08-23 14:02:25 -04:00
e2f25749e0
fix fetching spec versions early 2026-08-23 14:00:11 -04:00
47a3d9d92f
Add comment about why MaterialUiCompatibilityBridge is needed for HtmlWidget
[skip ci]
2026-08-22 15:19:46 -04:00
a680c5cd0c
update navigation_rail_m3e hash 2026-08-22 15:15:39 -04:00
0887421f3e
put bridge for link colors 2026-08-22 15:14:41 -04:00
a090d88a23
add theming workaround for navigation_rail_m3e 2026-08-22 15:12:35 -04:00
32693fb3b5
fix path in nix build 2026-08-22 14:26:28 -04:00
4e1f1b64bc
run APK build on x86_64 2026-08-22 14:18:12 -04:00
20f1c784f6
optimize gomuks build size 2026-08-22 14:16:35 -04:00
9b79304edc
try to optimize APK size 2026-08-22 14:05:31 -04:00
b797b8de9c
fix icons not rendering 2026-08-22 13:51:44 -04:00
56bb75866c
bump JDK version 2026-08-22 13:50:00 -04:00
3baea40669
skip broken android lints 2026-08-22 13:24:26 -04:00
2e72ecd559
fix navigation_rail_m3e hash
Fixes nix build
2026-08-22 13:06:33 -04:00
077044ec19 Move to Flutter 3.47, use the improvements that come with this (#64)
Reviewed-on: Nexus/nexus#64
2026-08-22 13:04:33 -04:00
01b13b4764
set min version of macos to 13.0 2026-08-12 10:46:32 -04:00
050e42cc6f
comp for older macos 2026-08-12 10:34:36 -04:00
67cee201b6
add TODO comment to LinkToMention extension 2026-08-11 20:52:14 -04:00
2d7b067c93
use mobile icon for macOS
this looks better in the macos launcher squircles
2026-08-11 20:39:04 -04:00
a9993013f5
add rooms to mention chips
Needs handling for event links, plus clickability
2026-08-11 20:34:43 -04:00
9c488e8981
only upload .dmgs 2026-08-11 20:08:59 -04:00
5c16f42d20
pin upload-artifact to a commit 2026-08-11 19:58:15 -04:00
092fc616e6
fix paths in macos CI 2026-08-11 19:56:26 -04:00
6cbf78be6b
change step names for macos
[skip ci]
2026-08-11 19:20:08 -04:00
68f4bb0c03
update macos status in readme 2026-08-11 19:18:09 -04:00
9e24f4cb31
add DMG builds 2026-08-11 19:12:56 -04:00
43d2e94d62
make loadOlder properly guard 2026-08-11 10:39:45 -04:00
62fe37c6ae
use mobile icons on iOS 2026-08-11 10:17:24 -04:00
b9dfbd3ca2
update MacOS icons 2026-08-11 10:16:18 -04:00
620440e2a1
Allow logging into homeservers without discovery working 2026-08-10 22:50:13 -04:00
724171384c
change readme wording
[skip ci]
2026-08-08 20:49:23 -04:00
1bd677eb23
add MacOS support to readme 2026-08-08 20:36:48 -04:00
41658c3a9d
change output artifact name for macos ci 2026-08-08 20:33:41 -04:00
b011cc2166
reformat build hook file
[skip ci]
2026-08-08 20:31:09 -04:00
75ad6cbd02
set SDKROOT for macos build 2026-08-08 20:20:02 -04:00
6c1d3d8894
debug macos 2026-08-08 20:08:49 -04:00
842ab0a82c
don't use xcrun clang on macos 2026-08-08 19:57:03 -04:00
a0e5d2fb9e
make macos-related actions not use nix 2026-08-08 19:48:56 -04:00
a2cdc3df68
set CC manually macos 2026-08-08 19:08:20 -04:00
07f8a35b74
bump deps, remove hack for fallback theme that is no longer needed 2026-08-08 19:05:04 -04:00
85b9007c47
bump flake 2026-08-08 18:53:12 -04:00
5bbd51c4bc
fix macos permission issues 2026-08-08 18:52:49 -04:00
21a0e0db70
correctly undo lipo changes 2026-08-08 18:03:57 -04:00
a5f42fe56e
add workaround for lipo issues with Flutter from Nix on MacOS 2026-08-08 17:56:01 -04:00
185c1d2714
undo lipo changes 2026-08-08 17:53:58 -04:00
7eab09585b
Revert "move lipo wrapper"
This reverts commit 56dbd91c96.
2026-08-08 17:51:00 -04:00
c84f0e7e93
dismiss keyboard on scroll of room chat 2026-08-08 17:02:31 -04:00
f7847d587c
only enable autofocus on desktop platforms 2026-08-08 16:57:51 -04:00
56dbd91c96
move lipo wrapper 2026-08-08 16:49:25 -04:00
7bb4d87638 feat: Add iOS platform support (#60)
Co-authored-by: Henry-Hiles <henry@henryhiles.com>
Reviewed-on: Nexus/nexus#60
2026-08-08 16:35:56 -04:00
bf31f5510a
make room dialog scrollable 2026-08-08 16:21:58 -04:00
bd185824f9
set loading when waiting for token exchange 2026-08-08 16:18:54 -04:00
2afd5ae258
put account data keys in model 2026-08-08 16:14:11 -04:00
76f9175857
update gomuks vendorHash 2026-08-08 13:27:10 -04:00
e32941f062
remove old extraEnv for macos
No longer needed.
2026-08-08 13:22:51 -04:00
cf89604ff5
update gomuks
Fixes error when fetching versions after login
2026-08-08 13:21:29 -04:00
553 changed files with 29855 additions and 6597 deletions

View file

@ -0,0 +1,28 @@
name: "End-to-end tests"
on:
push:
branches: ["main"]
pull_request:
workflow_dispatch:
jobs:
e2e:
runs-on: ["large", "debian-13-x86_64"]
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Lix GHA Installer Action
uses: samueldr/lix-gha-installer-action@v2026-02-22
with:
extra_nix_config: experimental-features = nix-command flakes flake-self-attrs
- name: Generate code
run: nix develop --command bash -c "flutter pub get && dart scripts/generate.dart && flutter pub run build_runner build"
- name: Run end-to-end tests
run: nix run .#e2e-headless

View file

@ -1,39 +1,39 @@
name: "Build APK"
on:
push:
branches: ["main"]
tags: ["*"]
workflow_dispatch:
push:
branches: ["main"]
tags: ["*"]
workflow_dispatch:
jobs:
build-apk:
runs-on: ubuntu-latest
build-apk:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Lix GHA Installer Action
uses: samueldr/lix-gha-installer-action@v2026-02-22
with:
extra_nix_config: experimental-features = nix-command flakes flake-self-attrs
- name: Decode keystore
run: echo "$KEYSTORE_CONTENT" | base64 --decode > keystore.jks
env:
KEYSTORE_CONTENT: ${{ secrets.KEYSTORE_CONTENT }}
- name: Lix GHA Installer Action
uses: samueldr/lix-gha-installer-action@v2026-02-22
with:
extra_nix_config: experimental-features = nix-command flakes flake-self-attrs
- name: Build app
run: nix develop --command bash -c "flutter pub get && dart scripts/generate.dart && flutter pub run build_runner build && flutter build apk --release"
env:
KEYSTORE_PATH: ../../keystore.jks
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
- name: Decode keystore
run: echo "$KEYSTORE_CONTENT" | base64 --decode > keystore.jks
env:
KEYSTORE_CONTENT: ${{ secrets.KEYSTORE_CONTENT }}
- name: Upload installer artifact
uses: actions/upload-artifact@v6
with:
name: APK
path: build/app/outputs/flutter-apk/app-release.apk
- name: Build app
run: nix develop --command bash -c "flutter pub get && dart scripts/generate.dart && flutter pub run build_runner build && flutter build apk --target-platform android-arm64 --split-per-abi --dart-define=GIT_COMMIT=${{ github.sha }}"
env:
KEYSTORE_PATH: ../../keystore.jks
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
- name: Upload installer artifact
uses: actions/upload-artifact@v6
with:
name: APK
path: build/app/outputs/flutter-apk/app-arm64-v8a-release.apk

View file

@ -1,37 +1,73 @@
name: "Build Flatpaks"
on:
push:
branches: ["main"]
tags: ["*"]
workflow_dispatch:
push:
branches: ["main"]
tags: ["*"]
workflow_dispatch:
jobs:
build-flatpak:
strategy:
fail-fast: false
matrix:
include:
- arch: x86_64
runner: ubuntu-latest
- arch: aarch64
runner: ubuntu-24.04-arm
runs-on: ${{ matrix.runner }}
build-flatpak:
strategy:
fail-fast: false
matrix:
include:
- arch: x86_64
runner: ubuntu-latest
- arch: aarch64
runner: ubuntu-24.04-arm
runs-on: ${{ matrix.runner }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Lix GHA Installer Action
uses: samueldr/lix-gha-installer-action@v2026-02-22
with:
extra_nix_config: experimental-features = nix-command flakes flake-self-attrs
- name: Lix GHA Installer Action
uses: samueldr/lix-gha-installer-action@v2026-02-22
with:
extra_nix_config: experimental-features = nix-command flakes flake-self-attrs
- name: Build app
run: nix build .#flatpak
- name: Build app
run: nix build .#flatpak
- name: Upload installer artifact
uses: actions/upload-artifact@v6
with:
name: flatpak-${{ matrix.arch }}
path: result/nexus.federated.nexus.flatpak
- name: Upload installer artifact
uses: actions/upload-artifact@v6
with:
name: flatpak-${{ matrix.arch }}
path: result/nexus.federated.nexus.flatpak
publish:
needs: build-flatpak
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Install flatpak tooling
run: sudo apt-get update && sudo apt-get install -y flatpak ostree
- name: Download bundles
uses: actions/download-artifact@v7
with:
pattern: flatpak-*
path: bundles
- name: Build OSTree repo
run: |
ostree init --repo=repo --mode=archive-z2
for bundle in bundles/*/nexus.federated.nexus.flatpak; do
flatpak build-import-bundle repo "$bundle"
done
flatpak build-update-repo --prune repo
- uses: actions/upload-pages-artifact@v4
with:
path: repo
- name: Deploy to Pages
id: deployment
uses: actions/deploy-pages@v4

48
.github/workflows/ios.yml vendored Normal file
View file

@ -0,0 +1,48 @@
name: "Build iOS App"
on:
push:
branches: ["main"]
tags: ["*"]
workflow_dispatch:
jobs:
build-app:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: 3.47.4
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: gomuks/go.mod
- name: Build app
run: |
flutter pub get
dart scripts/generate.dart
flutter pub run build_runner build
flutter build ios --no-codesign --dart-define=GIT_COMMIT=${{ github.sha }}
# Unsigned IPA: SideStore/AltStore re-sign this on-device with the
# user's own Apple ID at install time, so no certificate is needed here.
- name: Package unsigned IPA
run: |
mkdir Payload
cp -r build/ios/iphoneos/Runner.app Payload/
zip -r Nexus.ipa Payload
- name: Upload IPA artifact
uses: actions/upload-artifact@v6
with:
name: Nexus.ipa
path: Nexus.ipa

View file

@ -1,32 +1,47 @@
name: "Build MacOS App"
on:
# TODO: Uncomment this once the MacOS workflow actually works
# push:
# branches: ["main"]
# tags: ["*"]
workflow_dispatch:
push:
branches: ["main"]
tags: ["*"]
workflow_dispatch:
jobs:
build-app:
runs-on: macos-latest
build-app:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Lix GHA Installer Action
uses: samueldr/lix-gha-installer-action@v2026-02-22
with:
extra_nix_config: experimental-features = nix-command flakes flake-self-attrs
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: 3.47.4
- name: Build app
run: nix develop --command bash -c "flutter pub get && dart scripts/generate.dart && flutter pub run build_runner build && flutter build macos --release"
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: gomuks/go.mod
- name: Upload installer artifact
uses: actions/upload-artifact@v6
with:
name: App
path: build/macos/Build/Products/Release/Nexus.app
- name: Build App
run: |
flutter pub get
dart scripts/generate.dart
flutter pub run build_runner build
flutter build macos --dart-define=GIT_COMMIT=${{ github.sha }}
- name: Create DMG
id: create-dmg
uses: L-Super/create-dmg-actions@28511e988b13ca34096d439159a66d468b8e724f
with:
dmg_name: nexus
src_dir: build/macos/Build/Products/Release/Nexus.app
- name: Upload DMG
uses: actions/upload-artifact@v6
with:
name: nexus.dmg
path: ${{ steps.create-dmg.outputs.dmg_path }}

View file

@ -1,65 +1,74 @@
name: "Build EXE"
on:
push:
branches: ["main"]
tags: ["*"]
workflow_dispatch:
push:
branches: ["main"]
tags: ["*"]
workflow_dispatch:
jobs:
build-exe:
runs-on: windows-latest
build-exe:
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: 3.44.4
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: 3.47.4
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: gomuks/go.mod
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: gomuks/go.mod
- name: Setup MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: MINGW64
install: >-
mingw-w64-x86_64-gcc
- name: Setup MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: CLANG64
install: >-
mingw-w64-x86_64-gcc
- name: Go build
run: |
cd gomuks/pkg/ffi
go build -tags goolm,sqlite_fts5 -o ../../../libgomuks.dll -buildmode=c-shared
- name: Go build
run: |
cd gomuks/pkg/ffi
go build -tags goolm,sqlite_fts5 -o ../../../libgomuks.dll -buildmode=c-shared
- name: Build with Flutter
run: |
flutter pub get
dart scripts/generate.dart
flutter pub run build_runner build
flutter build windows --release
- name: Build with Flutter
run: |
flutter pub get
dart scripts/generate.dart
flutter pub run build_runner build
flutter build windows --dart-define=GIT_COMMIT=${{ github.sha }}
- name: Copy MinGW runtime DLLs
shell: msys2 {0}
run: |
cp /mingw64/bin/libgcc_s_seh-1.dll build/windows/x64/runner/Release/
cp /mingw64/bin/libwinpthread-1.dll build/windows/x64/runner/Release/
cp /mingw64/bin/libstdc++-6.dll build/windows/x64/runner/Release/
- name: Copy MinGW runtime DLLs
shell: msys2 {0}
run: |
cp /mingw64/bin/libgcc_s_seh-1.dll build/windows/x64/runner/Release/
cp /mingw64/bin/libwinpthread-1.dll build/windows/x64/runner/Release/
cp /mingw64/bin/libstdc++-6.dll build/windows/x64/runner/Release/
- name: Install Inno Setup
run: choco install innosetup -y
- name: Copy MSVC runtime DLLs
shell: powershell
run: |
$release = "build/windows/x64/runner/Release"
- name: Build Inno Setup installer
run: iscc windows/installer.iss
Copy-Item C:\Windows\System32\MSVCP140.dll $release -Force
Copy-Item C:\Windows\System32\VCRUNTIME140.dll $release -Force
Copy-Item C:\Windows\System32\VCRUNTIME140_1.dll $release -Force
- name: Upload installer artifact
uses: actions/upload-artifact@v6
with:
name: windows-installer
path: windows/dist/Nexus-Setup.exe
- name: Install Inno Setup
run: choco install innosetup -y
- name: Build Inno Setup installer
run: iscc windows/installer.iss
- name: Upload installer artifact
uses: actions/upload-artifact@v6
with:
name: windows-installer
path: windows/dist/Nexus-Setup.exe

4
.gitignore vendored
View file

@ -41,4 +41,6 @@ key.properties
password.txt
# Nix
/result
/result
# Widget Preview related
.widget_preview/

2
.gitmodules vendored
View file

@ -1,4 +1,4 @@
[submodule "gomuks"]
path = gomuks
url = https://github.com/gomuks/gomuks
branch = main
branch = quad/nexus

View file

@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.
version:
revision: "nixpkgs000000000000000000000000000000000"
revision: "6b182d2c7585eba26d4edce0f97630effd256c33"
channel: "stable"
project_type: app
@ -13,11 +13,11 @@ project_type: app
migration:
platforms:
- platform: root
create_revision: nixpkgs000000000000000000000000000000000
base_revision: nixpkgs000000000000000000000000000000000
- platform: macos
create_revision: nixpkgs000000000000000000000000000000000
base_revision: nixpkgs000000000000000000000000000000000
create_revision: 6b182d2c7585eba26d4edce0f97630effd256c33
base_revision: 6b182d2c7585eba26d4edce0f97630effd256c33
- platform: ios
create_revision: 6b182d2c7585eba26d4edce0f97630effd256c33
base_revision: 6b182d2c7585eba26d4edce0f97630effd256c33
# User provided section

17
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,17 @@
{
"configurations": [
{
"name": "Flutter",
"type": "dart",
"request": "launch",
"program": "lib/main.dart"
},
{
"name": "Flutter (Headless)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"env": { "FLUTTER_HEADLESS": "1" }
}
]
}

View file

@ -10,7 +10,11 @@
"msgtype",
"muks",
"prefs",
"recents",
"unban",
"unredact"
"underride",
"unifiedpush",
"unredact",
"webpush"
]
}

View file

@ -21,28 +21,32 @@ See [Effective Dart: Style](https://dart.dev/effective-dart/style) for general r
Controllers live in `lib/controllers/` and provide a source that exposes data and logic via Riverpod providers, allowing other parts of the code to watch state changes with ref.watch (`ref.watch(MyController.provider)`), access the current value with ref.read (`ref.read(MyController.provider)`), and run helper methods on those classes using the notifier:
```dart
ref.watch(MyController.provider.notifier).helperMethod()
ref.read(MyController.provider.notifier).helperMethod()
```
We use an object oriented style for controllers, where `provider` is a static member on the controller class. E.g.
```dart
class MyController extends AsyncNotifier<DataThisControllerExposes> {
final SomeInputType input;
MyController(this.input);
class MyController(final SomeInputType input)
extends AsyncNotifier<DataThisControllerExposes> {
@override
Future<DataThisControllerExposes> build() async {
return input.foo;
}
static final provider =
AsyncNotifierProvider.family<MyController, DataThisControllerExposes, SomeInputType>(
AuthorController.new,
);
AsyncNotifierProvider.family<MyController, DataThisControllerExposes, SomeInputType>(
MyController.new,
);
}
```
#### `watch` vs `read`
Only use `ref.watch` in a `build` method, where you want to rebuild when the value changes. Everywhere else, like callbacks, `useEffect`, and methods on a controller, use `ref.read`.
Use `.select` to narrow down what you depend on, e.g. `ref.watch(RoomsController.provider.select((rooms) => rooms[roomId]))`.
Providers which are not controllers, e.g. they expose no data, only methods, should instead live in `lib/helpers/`. For an example, see `lib/helpers/launch_helper.dart`. Other, non-provider helpers, like extensions or helper methods can also go in `lib/helpers/`.
### Don't use StatefulWidgets ([Flutter Hooks](https://pub.dev/packages/flutter_hooks))
@ -61,6 +65,36 @@ When possible, use immutable collections instead of the mutable equivalent. For
When possible, we prefer not to create global variables or methods. You can usually replace a global variable with a Riverpod controller, and a global method with an extension method.
I'm also not a big fan of unneeded private methods or variables, but this is contextual.
### Modern Dart syntax
We try to use newer Dart language features where they make code shorter:
- Primary constructors for classes, including widgets, e.g. `class const MemberList(final String roomId, {super.key}) extends HookConsumerWidget`.
- Dot shorthands wherever the type can be inferred, e.g. `.new(...)`, `padding: .all(8)`, `relationType == .reply`.
- Patterns and switch expressions over null checks and casts, e.g. `if (event.content case MessageContent(:final body?))` rather than checking `is` then using `!`.
### Prefer `map` over inline `for` loops
When building a list (or set, or map) from another collection, use `.map`, `.expand` and friends rather than a `for` inside the collection literal:
```dart
// Prefer
children: rooms.map((room) => RoomTile(room)).toList(),
// Over
children: [for (final room in rooms) RoomTile(room)],
```
Regular `for` statements are fine for logic that doesn't just build a collection.
### Async values and errors
When rendering an `AsyncValue`, use the `betterWhen` extension, which shows our standard loading and error widgets, or a switch expression if you need more control (e.g. `AsyncData(:final value) || AsyncLoading(:final value?)` to keep showing old data while reloading).
For futures started from the UI that nothing awaits, like button presses, add `.onError(showError)` so failures are shown to the user instead of being lost.
## LLM/AI Assisted Contributions
LLM generated code is NOT allowed. All contributions should be written by humans. Using LLMs for interacting with others, e.g. for Comments, PRs, etc, is also not allowed.

162
README.md
View file

@ -1,8 +1,5 @@
# Nexus Client
> [!WARNING]
> Nexus Client is still in development, and doesn't support everything needed for daily use.
## Description
A simple and user-friendly Matrix client made with Flutter and a Gomuks backend.
@ -13,112 +10,63 @@ A simple and user-friendly Matrix client made with Flutter and a Gomuks backend.
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------: |
| ![Screenshot of Nexus Client in dark mode, showing users talking, with a sidebar showing rooms and spaces, and another sidebar showing members](./assets/screenshotDark.png) | ![The same screenshot as above, but in light mode](./assets/screenshotLight.png) |
## Progress
- [ ] Platform Support
- [x] Linux
- [x] Windows
- [x] Android
- [ ] MacOS ([#50](https://git.federated.nexus/Nexus/nexus/issues/50))
- [ ] iOS
- [ ] Web (may not be possible)
- [x] Login (via OAuth)
- [x] Rooms / Spaces
- [x] Displaying and choosing
- [x] Reading, showing unread
- [x] Mark as read button on rooms and spaces
- [ ] Searching
- [ ] Creating (Rooms, Spaces, and DMs)
- [x] Joining
- [x] Parse vias
- [x] Using a text/uri/link
- [x] Plain text
- [x] `matrix:` Uri
- [x] Matrix.to link
- [ ] From space
- [ ] From directory
- [x] Leaving
- [x] Subspaces
- [x] Messages
- [x] Encryption
- [x] Restoring crypto identity from a recovery passphrase/key
- [x] Sending
- [x] Plain text
- [x] HTML/Markdown
- [x] Replies
- [x] Choose ping on/off
- [x] Per message profiles
- [x] Attachments
- [ ] Commands with [MSC4391](https://github.com/matrix-org/matrix-spec-proposals/pull/4391)
- [x] Mentions
- [x] Users
- [x] Rooms
- [ ] Inline emoji picker (Putting this here since it'll be implemented the same way as mentions)
- [ ] Custom emojis/stickers
- [ ] GIFs using Gomuks' GIF proxies
- [x] Receiving
- [x] Plain text
- [x] Per message profiles
- [x] HTML
- [x] URL Previews
- [x] Replies
- [x] Viewing
- [ ] Jump to original message
- [x] In loaded timeline
- [ ] Out of loaded timeline
- [x] Edits
- [x] Attachments
- [x] Unencrypted
- [x] Encrypted
- [x] Blurhashing
- [ ] Downloading attachments
- [x] Opening attachments in their own view
- [ ] Polls
- [x] Mentions
- [x] Users
- [x] Clickable
- [x] Rooms
- [ ] Clickable
- [x] Matrix URIs
- [x] Matrix.to links
- [x] Events
- [ ] Render more nicely
- [ ] Clickable
- [x] Custom emojis/stickers
- [x] History loading
- [x] Editing
- [x] Deleting
- [x] Reactions
- [x] Pins
- [x] Displaying
- [x] Pinning/Unpinning
- [ ] Threads
- [x] Profile popouts
- [x] Working actions
- [x] Copy link to:
- [x] Room
- [x] Space
- [x] Message
- [ ] Reporting
- [x] Events
- [ ] Rooms
- [x] Member list
- [x] Sort by power level
- [ ] Colors based off of power level
- [ ] Notifications using UnifiedPush ([#35](https://git.federated.nexus/Nexus/nexus/issues/35))
- [ ] Group calls using [MSC4195](https://github.com/matrix-org/matrix-spec-proposals/pull/4195)
- [ ] Invites
- [x] Settings
## Try it out
If you want to try out Nexus, grab one of the following artifacts from CI:
If you want to try out Nexus, download the [latest release](https://git.federated.nexus/Nexus/nexus/releases/latest).
### Nightly Builds
For the newest changes, grab one of the following nightly artifacts, built by CI from the latest commit on `main`.
- [Android APK](https://nightly.link/Henry-Hiles/nexus/workflows/android/main/APK.zip)
- [Unsigned iOS IPA](https://nightly.link/Henry-Hiles/nexus/workflows/ios/main/Nexus.ipa.zip)
- [Unsigned MacOS DMG](https://nightly.link/Henry-Hiles/nexus/workflows/macos/main/nexus.dmg.zip)
- [Windows EXE](https://nightly.link/Henry-Hiles/nexus/workflows/windows/main/windows-installer.zip)
- Flatpak
- [AArch64/Arm64](https://nightly.link/Henry-Hiles/nexus/workflows/flatpak/main/flatpak-aarch64.zip)
- [x86_64/AMD64](https://nightly.link/Henry-Hiles/nexus/workflows/flatpak/main/flatpak-x86_64.zip)
Or, use one of the below methods:
### Nightly Flatpak Repo
Make sure Flatpak is set up on your system, then run:
```bash
flatpak install --user https://nexus.federated.nexus/flatpak/nexus.flatpakref
```
This adds the Nexus remote and installs the app for your user only, so no root access is needed (x86_64 and aarch64 are supported). To install system-wide instead, use `--system` in place of `--user`. Updates arrive through `flatpak update` or your software center.
### NixOS Module
Add Nexus as a flake input, following `nixpkgs` for less fetches:
```nix
nexus = {
url = "git+https://git.federated.nexus/Nexus/nexus";
inputs.nixpkgs.follows = "nixpkgs";
};
```
This tracks the latest commit on `main`. To stay on a release instead, pin the input to its tag:
```nix
url = "git+https://git.federated.nexus/Nexus/nexus?ref=refs/tags/v1.0.1";
```
Then import the module and enable it in your NixOS configuration:
```nix
{ inputs, ... }:
{
imports = [ inputs.nexus.nixosModules.default ];
programs.nexus = {
enable = true;
enableNotifications = true; # optional: push notifications via UnifiedPush
};
}
```
This installs Nexus system-wide. With `enableNotifications`, it also installs KUnifiedPush and registers its systemd and D-Bus services so notifications work. The `package` option lets you override the package if you need to.
## Build it yourself
@ -126,8 +74,8 @@ If you want to try out Nexus, grab one of the following artifacts from CI:
#### Linux
- With Nix: Either use direnv and `direnv allow`, or `nix flake develop`
- Without Nix: Install Flutter, Go, Git, Libclang, Libass, MPV, and Glibc. Do not use any Snap packages, they cause various compilation issues.
- On NixOS: Either use direnv and `direnv allow`, or `nix develop`
- On other distros: Install Flutter, Go, Git, Libclang, Libass, MPV, and Glibc. Do not use any Snap packages, they cause various compilation issues.
#### Windows
@ -205,7 +153,7 @@ Development instructions can be found in [DEVELOPMENT.md](./DEVELOPMENT.md).
Join the [Nexus Client Matrix room](https://matrix.to/#/#nexus:federated.nexus) for questions or help with developing or using Nexus Client.
# Credits
## Credits
Thank you Hylke Bons (https://planetpeanut.studio) for making the amazing icon for Nexus!
Thank you Tulir Asokan for making [Gomuks](https://github.com/gomuks/gomuks), and helping us integrate it into Nexus!

View file

@ -1,12 +1,18 @@
analyzer:
errors:
invalid_annotation_target: ignore
avoid_print: ignore
exclude:
- "build/**"
- "**/*.g.dart"
- "**/*.freezed.dart"
errors:
invalid_annotation_target: ignore
avoid_print: ignore
exclude:
- "build/**"
- "**/*.g.dart"
- "**/*.freezed.dart"
- android/**
- ios/**
- web/**
- windows/**
- macos/**
- linux/**
include: package:flutter_lints/flutter.yaml
linter:
rules:
prefer_double_quotes: true
rules:
prefer_double_quotes: true

View file

@ -1,77 +0,0 @@
plugins {
id "com.android.application"
id "kotlin-android"
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file("local.properties")
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader("UTF-8") { reader ->
localProperties.load(reader)
}
}
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
if (flutterVersionCode == null) {
flutterVersionCode = "1"
}
def flutterVersionName = localProperties.getProperty("flutter.versionName")
if (flutterVersionName == null) {
flutterVersionName = "1.0"
}
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
namespace = "nexus.federated.nexus"
ndkVersion = flutter.ndkVersion
compileSdk = 34
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
defaultConfig {
applicationId = "nexus.federated.nexus"
minSdk = 29
targetSdkVersion flutter.targetSdkVersion
versionCode = flutterVersionCode.toInteger()
versionName = flutterVersionName
}
signingConfigs {
release {
keyAlias "key"
def storePath = keystoreProperties['path'] ?: System.getenv("KEYSTORE_PATH")
storeFile storePath ? file(storePath) : null
keyPassword keystoreProperties['password'] ?: System.getenv("KEYSTORE_PASSWORD")
storePassword keystoreProperties['password'] ?: System.getenv("KEYSTORE_PASSWORD")
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
debug {
applicationIdSuffix = ".debug"
}
}
}
flutter {
source = "../.."
}

View file

@ -0,0 +1,84 @@
import java.util.Properties
plugins {
id("com.android.application")
id("dev.flutter.flutter-gradle-plugin")
}
val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystorePropertiesFile.inputStream().use {
keystoreProperties.load(it)
}
}
android {
namespace = "nexus.federated.nexus"
compileSdk = 36
ndkVersion = flutter.ndkVersion
compileOptions {
isCoreLibraryDesugaringEnabled = true
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
defaultConfig {
applicationId = "nexus.federated.nexus"
minSdk = 29
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
multiDexEnabled = true
}
signingConfigs {
create("release") {
keyAlias = "key"
val storePath =
keystoreProperties["path"]?.toString()
?: System.getenv("KEYSTORE_PATH")
storeFile = storePath?.let { file(it) }
keyPassword =
keystoreProperties["password"]?.toString()
?: System.getenv("KEYSTORE_PASSWORD")
storePassword =
keystoreProperties["password"]?.toString()
?: System.getenv("KEYSTORE_PASSWORD")
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
}
debug {
applicationIdSuffix = ".debug"
}
}
}
dependencies {
implementation("org.unifiedpush.android:embedded-fcm-distributor:3.1.0")
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
}
kotlin {
compilerOptions {
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21
}
}
flutter {
source = "../.."
}

View file

@ -1,12 +1,16 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />
<!-- Until https://github.com/flutter/flutter/issues/145290 is fixed, we need enableOnBackInvokedCallback as false -->
<application
android:enableOnBackInvokedCallback="false"
android:label="Nexus"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
@ -30,6 +34,13 @@
<data android:scheme="nexus.federated.nexus" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="matrix" />
</intent-filter>
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
@ -49,6 +60,16 @@
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<!-- Needed by pasteboard, for pasting files from the clipboard -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and

View file

@ -1,5 +0,0 @@
package nexus.federated.nexus
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity()

View file

@ -0,0 +1,40 @@
package nexus.federated.nexus
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.WindowInsets
import android.view.WindowInsetsAnimation
import io.flutter.embedding.android.FlutterActivity
// TODO: Revert this commit once https://github.com/flutter/flutter/issues/191156 is fixed
class MainActivity: FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) return
window.decorView.setWindowInsetsAnimationCallback(
object : WindowInsetsAnimation.Callback(DISPATCH_MODE_CONTINUE_ON_SUBTREE) {
override fun onProgress(
insets: WindowInsets,
runningAnimations: List<WindowInsetsAnimation>,
) = insets
override fun onEnd(animation: WindowInsetsAnimation) {
if ((animation.typeMask and WindowInsets.Type.ime()) != 0) reapplyInsets()
}
},
)
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) reapplyInsets()
}
// Posted so it runs after Flutter has applied any insets it deferred.
private fun reapplyInsets() {
val view = findViewById<View>(FLUTTER_VIEW_ID) ?: return
view.post { view.rootWindowInsets?.let(view::onApplyWindowInsets) }
}
}

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external_files"
path="." />
</paths>

Some files were not shown because too many files have changed in this diff Show more