Compare commits

..

93 commits

Author SHA1 Message Date
525552ac94
Merge pull request #392 from twonlyapp/dev
Some checks failed
Publish on Github / build_and_publish (push) Has been cancelled
Feature: Show link in chat if the saved media file contains one
Improve: Verification badge for groups 
Improve: Huge reduction in app size
Fix: Crash on older devices when compressing a video
Fix: Problem with decrypting messages fixed
2026-03-01 23:36:11 +01:00
fb1e286cf9 fix signal out of sync issue
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run
2026-03-01 23:34:07 +01:00
3806525653 use sql match
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run
2026-03-01 21:38:32 +01:00
cd00910e86 fix link shown even if message was not stored 2026-03-01 21:37:57 +01:00
609c7abb55 fixes issue on android
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run
2026-03-01 16:46:04 +01:00
87ddb8ebdb remove ffmpeg from dependencies to reduce file size 2026-03-01 16:32:21 +01:00
d04828b020 Improve: Verification badge for groups
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run
2026-03-01 15:19:04 +01:00
e9ea0a7f16 feature: Show link in chat if the saved media file contains one
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run
2026-03-01 14:54:09 +01:00
ca62069652 remove avatar indicators in group chats 2026-03-01 13:58:33 +01:00
d52bb64ea9 Merge pull request 'dev' (#5) from dev into main
Fix: Problem with decrypting messages fixed
2026-03-01 03:27:03 +00:00
2cf9e575e9 bump version 2026-03-01 04:24:57 +01:00
4cbeaf3ff7 remove unnecessary pre key loading 2026-03-01 04:20:37 +01:00
eb70d7119f remove old database 2026-03-01 04:18:43 +01:00
de41111194 compress lottie files 2026-02-21 02:42:42 +01:00
6eb636f9dd Merge pull request 'dev' (#4) from dev into main
- Feature: Verification checkmark for friends
- Fix: Added contacts in contact sharing that were not clickable.
- Fix: Open chat after the image expires in case a draft message exists
- Fix: Restore flames as a plus user
- Fix: Route not found when sharing image
- Fix: Increase recent limit in emoji keyboard
- Fix: Increase show time of the focus indication
- Fix: Quoted text message not shown properly
- Fix: Push notification in groups when someone saves an image
- Fix: Dark mode in diagnostics view
2026-02-21 00:44:39 +00:00
7c9c4896d4 bump version 2026-02-21 01:43:44 +01:00
cf0132e75b improve logging 2026-02-21 01:41:07 +01:00
80910c1ba0 Fix: Dark mode in diagnostics view 2026-02-21 01:35:21 +01:00
bbe6954ca6 Fix: Push notification in groups when someone saves an image 2026-02-21 01:28:23 +01:00
3bb2620369 Fix: open chat after the image expires in case a draft message exists 2026-02-21 01:25:42 +01:00
15096056c0 fix analyzer and add changelog 2026-02-21 01:20:17 +01:00
30db0a1ff5 fix: quoted text message not shown properly 2026-02-21 01:18:35 +01:00
2b3ee4fbb3 fix: display the focus at least 500ms 2026-02-21 01:17:51 +01:00
8ef497772a fix: make contact shares click able if already added 2026-02-21 01:07:54 +01:00
6da6f1a9bc fix: increase emoji recent limit 2026-02-21 01:07:38 +01:00
f2b95386c6 feature: verification check mark 2026-02-21 01:01:25 +01:00
09afd3dda0 fix: allow plus plan to restore flames 2026-02-20 22:52:36 +01:00
f8242b003d bump version 2026-02-13 02:25:08 +01:00
b9a2300021 Merge pull request 'dev' (#3) from dev into main
Reviewed-on: #3
2026-02-13 01:17:48 +00:00
2bf0249f72 update changelog 2026-02-13 02:16:13 +01:00
835ee9ee2d feature: share contacts 2026-02-13 02:16:04 +01:00
15ae2b5669 feature: zoom in media viewer 2026-02-12 23:28:24 +01:00
b59687c5ca fix retransmission of media files + update dependencies 2026-02-12 23:04:17 +01:00
e6160990fe fix: null pointer 2026-02-12 21:54:53 +01:00
0f16ab68b7 fix: overwriting thumbnail 2026-02-12 21:54:42 +01:00
58dd5bb122 fix: logging issues 2026-02-12 21:54:23 +01:00
61a5352bb8 switch to go_router 2026-02-09 23:45:34 +01:00
8f7753c37f Merge pull request 'dev' (#2) from dev into main
## 0.0.91

- Fixes link preview on iOS
- Fixes sharing images from other apps on iOS

## 0.0.90

- Fixes issue that media files where not reuploaded
- Fixes iOS zooming issue when switching between .5 and x1
- Fixes biometric auth bypass when opening a twonly/reopen send image
- Fixes that media files could not be downloaded in case the contact deleted his account
- Fixes database issue in case twonly is opened multiple times
- Fixes typos in translation
2026-02-08 18:19:02 +00:00
dbc3ee62d0 add v again 2026-02-08 19:18:21 +01:00
408a2237bd remove v 2026-02-08 19:17:37 +01:00
736a718c70 fix: sharing links and media files on ios 2026-02-08 12:42:21 +01:00
8fe00cadbe Merge pull request 'dev' (#1) from dev into main
- Fixes issue that media files where not reuploaded
- Fixes iOS zooming issue when switching between .5 and x1
- Fixes biometric auth bypass when opening a twonly/reopen send image
- Fixes that media files could not be downloaded in case the contact deleted his account
- Fixes database issue in case twonly is opened multiple times
- Fixes typos in translation
2026-02-07 23:17:50 +00:00
90bf944bb3 update version 2026-02-08 00:17:02 +01:00
1b819c5b08 fix: add link handler to app links listener 2026-02-08 00:08:30 +01:00
21fbd8a04c fix: filter should be none when app is starting 2026-02-08 00:08:04 +01:00
2b1952a7ad fix: allow multiple instances to open the database 2026-02-07 23:52:35 +01:00
17c22c2f80 fix zoom issue on ios 2026-02-07 23:52:11 +01:00
47904275e1 fix: authentication not enforced 2026-02-07 23:24:25 +01:00
a6b673afad fix: missing translation 2026-02-07 23:03:35 +01:00
3aea367dfd remove unused code 2026-02-07 23:02:43 +01:00
4f6bffa61a fix: images was not reuploaded in case of a reupload request 2026-02-07 23:02:36 +01:00
90bf634f59 bug: verifies user still has an account before trying to download a media file 2026-02-07 23:01:29 +01:00
e8b9466e15 remove gender from survey 2026-02-07 22:58:15 +01:00
5a56a092a0 adding roadmap 2026-01-27 11:53:42 +01:00
111befb84f update sub repo 2026-01-26 22:26:57 +01:00
42a81b9309 adds new filter 2026-01-25 16:46:41 +01:00
fb93d0c9ec fix deeplink 2026-01-25 13:32:28 +01:00
462dedc17d bump version 2026-01-25 13:26:18 +01:00
935d8101de fix link not getting deleted 2026-01-25 13:25:35 +01:00
aee31f5b40 fix increased twonly safe backup 2026-01-25 13:17:56 +01:00
7ac10d8326 fix #387 2026-01-25 13:08:42 +01:00
318bb72b64 fix timing issue 2026-01-25 12:40:00 +01:00
77166253ae fix #390 2026-01-25 12:39:53 +01:00
a029d2f4d5 fix user study open again 2026-01-24 20:12:55 +01:00
c4b5580bef
Merge pull request #389 from twonlyapp/dev
- Adds link preview to images
- Adds option to manual focus in the camera
- Adds support to switch between front and back cameras during video recording
- Adds basic face filters
- Improves image editor, like emojis or text under a drawing can be moved
- Improves speed after taking a picture  
- Fixes issue with emojis disappearing in the image editor
2026-01-24 13:46:16 +01:00
1e0a649e5a bump version 2026-01-24 13:45:43 +01:00
e8b98761a7
Merge pull request #388 from twonlyapp/dev
- Adds link preview to images
- Adds option to manual focus in the camera
- Adds support to switch between front and back cameras during video recording
- Adds basic face filters
- Improves image editor, like emojis or text under a drawing can be moved
- Improves speed after taking a picture  
- Fixes issue with emojis disappearing in the image editor
2026-01-24 13:44:01 +01:00
f93a337aa9 small bug fixes 2026-01-23 16:57:29 +01:00
fa767977dd fix #382 2026-01-23 16:39:27 +01:00
9813698e59 fix #380 2026-01-23 16:34:01 +01:00
6720604fc3 fix #386 2026-01-23 15:09:22 +01:00
8e8027c63c fix #384 2026-01-23 00:43:00 +01:00
3aa35a95c5 show emojis above the link 2026-01-23 00:35:07 +01:00
1b72ec5649 add to share menu #366 2026-01-23 00:34:12 +01:00
76c56b06fe fix #383 2026-01-22 23:58:33 +01:00
b48df1baa5 fix #366 2026-01-22 23:26:23 +01:00
4c06bcc751 fix analyzer 2026-01-22 20:14:05 +01:00
8c3ea92b85 adds user study 2026-01-22 20:07:43 +01:00
f5d4f97c02 improving link parser 2026-01-21 23:14:23 +01:00
15c5a44b7d starting with #366 2026-01-20 00:44:32 +01:00
2ef4566d69 improve image editor 2026-01-19 23:15:28 +01:00
cd5deca6b6 improving camera 2026-01-18 15:23:52 +01:00
d83e9a26c4 fix: Apply platform-specific Y-axis scaling to face filter images. 2026-01-18 02:43:09 +01:00
42cc6db0e2 added support for face filters 2026-01-18 02:30:56 +01:00
bb49240b96
Merge pull request #379 from twonlyapp/dev
- Allows to reopen send images (if send without time limit or enabled auth) 
- Added support for front camera zoom
- Several bug fixes
2026-01-17 23:15:51 +01:00
448a28cdbd bump version 2026-01-17 23:15:02 +01:00
0ce197ce55
Merge pull request #377 from twonlyapp/dev
- Allows to reopen send images (if send without time limit or enabled auth) 
- Added support for front camera zoom
- Several bug fixes
2026-01-17 19:39:54 +01:00
5a7cc992a1 fix #368 2026-01-17 19:09:01 +01:00
8ecae72d80 fix #375 and #376 2026-01-17 19:02:54 +01:00
849102dd3b improve error messages for additional accounts 2026-01-17 17:20:33 +01:00
e824f4cd87 add group limit size 2026-01-17 17:05:14 +01:00
f24d91e313 update readme 2026-01-17 17:00:06 +01:00
f91f2c2fb9 allow user deletion 2026-01-17 16:59:58 +01:00
680 changed files with 32470 additions and 19366 deletions

3
.gitmodules vendored
View file

@ -1,7 +1,8 @@
[submodule "dependencies"] [submodule "dependencies"]
path = dependencies path = dependencies
url = https://github.com/twonlyapp/twonly-app-dependencies.git # url = ssh://git@git.twonly.eu:22222/twonly/twonly-app-dependencies.git
url = https://git.twonly.eu/twonly/twonly-app-dependencies.git
[submodule "lib/src/localization/translations"] [submodule "lib/src/localization/translations"]
path = lib/src/localization/translations path = lib/src/localization/translations
# url = ssh://git@git.twonly.eu:22222/twonly/twonly-translations.git # url = ssh://git@git.twonly.eu:22222/twonly/twonly-translations.git

View file

@ -1,5 +1,63 @@
# Changelog # Changelog
## 0.0.96
Feature: Show link in chat if the saved media file contains one
Improve: Verification badge for groups
Improve: Huge reduction in app size
Fix: Crash on older devices when compressing a video
Fix: Problem with decrypting messages fixed
## 0.0.93
- Feature: Verification checkmark for friends
- Fix: Added contacts in contact sharing that were not clickable.
- Fix: Open chat after the image expires in case a draft message exists
- Fix: Restore flames as a plus user
- Fix: Route not found when sharing image
- Fix: Increase recent limit in emoji keyboard
- Fix: Increase show time of the focus indication
- Fix: Quoted text message not shown properly
- Fix: Push notification in groups when someone saves an image
- Fix: Dark mode in diagnostics view
## 0.0.92
- Adds the option to share contacts
- Adds option to zoom in received images / videos
- Fixes issue with "reuploaded requested" not working
- Fixes race condition while writing to the log file
## 0.0.91
- Fixes link preview on iOS
- Fixes sharing images from other apps on iOS
## 0.0.90
- Fixes issue that media files where not reuploaded
- Fixes iOS zooming issue when switching between .5 and x1
- Fixes biometric auth bypass when opening a twonly/reopen send image
- Fixes that media files could not be downloaded in case the contact deleted his account
- Fixes database issue in case twonly is opened multiple times
- Fixes typos in translation
## 0.0.87
- Adds link preview to shared links
- Adds option to manual focus in the camera
- Adds support to switch between front and back cameras during video recording
- Adds basic face filters
- Improves image editor, like emojis or text under a drawing can be moved
- Improves speed after taking a picture
- Fixes issue with emojis disappearing in the image editor
## 0.0.86
- Allows to reopen send images (if send without time limit or enabled auth)
- Added support for front camera zoom
- Several bug fixes
## 0.0.83 ## 0.0.83
- Improved view of the diagnostic log - Improved view of the diagnostic log

View file

@ -2,14 +2,9 @@
<a href="https://twonly.eu" rel="some text"><img src="docs/header.webp" alt="twonly, a privacy-friendly way to connect with friends through secure, spontaneous image sharing." /></a> <a href="https://twonly.eu" rel="some text"><img src="docs/header.webp" alt="twonly, a privacy-friendly way to connect with friends through secure, spontaneous image sharing." /></a>
This repository contains the complete source code of the [twonly](https://twonly.eu) apps. This repository contains the complete source code of the [twonly](https://twonly.eu) app. twonly is a replacement for Snapchat, but its purpose is not to replace instant messaging apps, as there are already [many fantastic alternatives](https://www.messenger-matrix.de/messenger-matrix-en.html) out there. It was started because I liked the basic features of Snapchat, such as opening with the camera, the easy-to-use image editor, and the focus on sending fun pictures to friends. But I was annoyed by Snapchat's forced AI chat, receiving random messages to follow strangers, and not knowing how my sent images/text messages were encrypted, if at all. I am also very critical of the direction in which the US is currently moving and therefore try to avoid US providers wherever possible.
<!-- <a href="https://testflight.apple.com/join/U9B3v2rk" > <div style="margin: 10px 20px 10px 20px">
<img alt="Get it on Testflight button" src="https://twonly.eu/assets/buttons/get-it-on-testflight.png"
width="100px" />
</a> -->
<div class="my-5 space-x-4">
<div class="flex gap-5 items-center justify-center">
<a href="https://apps.apple.com/de/app/twonly/id6743774441"> <a href="https://apps.apple.com/de/app/twonly/id6743774441">
<img alt="Get it on App Store button" src="https://twonly.eu/assets/buttons/download-on-the-app-store.svg" <img alt="Get it on App Store button" src="https://twonly.eu/assets/buttons/download-on-the-app-store.svg"
width="100px" /> width="100px" />
@ -25,8 +20,8 @@ This repository contains the complete source code of the [twonly](https://twonly
<img alt="Get it on F-Droid button" src="https://twonly.eu/assets/buttons/get-it-on-f-droid.webp" width="105px" /> <img alt="Get it on F-Droid button" src="https://twonly.eu/assets/buttons/get-it-on-f-droid.webp" width="105px" />
</a> </a>
</div> </div>
</div>
If you decide to give twonly a try, please keep in mind that it is still in its early stages and is currently being developed by a single student. So if you are not satisfied at the moment, please come back later, as it is constantly being improved, and I may one day be able to develop it full-time.
## Features ## Features
@ -37,11 +32,24 @@ This repository contains the complete source code of the [twonly](https://twonly
- Privacy friendly - Everything is stored on the device - Privacy friendly - Everything is stored on the device
- The backend is hosted exclusively in Europe - The backend is hosted exclusively in Europe
## Planned ## Roadmap
- For Android: Optional support for [UnifiedPush](https://unifiedpush.org/) ### Currently
- For Android: Reproducible Builds
- Implementing [Sealed Sender](https://signal.org/blog/sealed-sender/) to minimize metadata - Focus on user-friendliness so that people enjoy using the app
- User discovery without a phone number
- Passwordless recovery without a phone number
- Implementation of features so that Snapchat can actually be replaced
- E2EE cloud backup of memories
- Importing memories from Snapchat
### Next on the bucket list
- For Android: Support for [UnifiedPush] (https://unifiedpush.org/)
- For Android: Reproducible builds
- Implementation of [Sealed Sender](https://signal.org/blog/sealed-sender/) (or a similar protocol) to minimize metadata
- Switch from the Signal protocol to [MLS](https://github.com/openmls/openmls) for post-quantum crypto support
- Decentralize the server so that anyone can run their own server
## Security Issues ## Security Issues
@ -49,6 +57,10 @@ If you discover a security issue in twonly, please adhere to the coordinated vul
us your report to security@twonly.eu. We also offer for critical security issues a small bug bounties, but we can not us your report to security@twonly.eu. We also offer for critical security issues a small bug bounties, but we can not
guarantee a bounty currently :/ guarantee a bounty currently :/
<!-- ## Contribution
If you have any questions or feature requests, feel free to start a new discussion. Issues are limited to bugs, and for maintainers only. -->
## Development ## Development
<details> <details>

View file

@ -11,6 +11,7 @@ analyzer:
avoid_positional_boolean_parameters: ignore avoid_positional_boolean_parameters: ignore
inference_failure_on_collection_literal: ignore inference_failure_on_collection_literal: ignore
matching_super_parameters: ignore matching_super_parameters: ignore
parameter_assignments: ignore
exclude: exclude:
- "lib/src/model/protobuf/**" - "lib/src/model/protobuf/**"
- "lib/src/model/protobuf/api/websocket/**" - "lib/src/model/protobuf/api/websocket/**"

View file

@ -5,7 +5,6 @@
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:enableOnBackInvokedCallback="true"
android:exported="true" android:exported="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:taskAffinity="" android:taskAffinity=""
@ -33,6 +32,20 @@
<data android:scheme="http" android:host="me.twonly.eu" /> <data android:scheme="http" android:host="me.twonly.eu" />
<data android:scheme="https" /> <data android:scheme="https" />
</intent-filter> </intent-filter>
<!-- Allow other apps to share links -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="*" />
</intent-filter>
<!-- Allow other apps to share links via plain text -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.SEND" /> <action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />

View file

@ -18,7 +18,7 @@ pluginManagement {
plugins { plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version '8.9.0' apply false id "com.android.application" version '8.9.1' apply false
// START: FlutterFire Configuration // START: FlutterFire Configuration
id "com.google.gms.google-services" version "4.3.15" apply false id "com.google.gms.google-services" version "4.3.15" apply false
// END: FlutterFire Configuration // END: FlutterFire Configuration

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

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