Your rating: None Average: 5 (16 votes)

Contrac is a beta-quality Corona-Warn-App compatible exposure notification app. It uses the Google/Apple Exposure Notification protocol and Germany's Corona-Warn-App backend servers.

The app supports sending/receiving exposure notification Bluetooth beacons, downloading and checking diagnosis keys from the servers and uploading positive test results using a TeleTAN.

The implementation is fully separate from the official implementations, so I can't offer any guarantee that it will necessarily work as expected. If you enter a TeleTAN it'll be officially registered (assuming the code works) so please only use it with real test results.

The app doesn't support the automatic download of test results using a QR code and it also requires nudging daily to download the diagnosis keys from the server. Both of these are being worked on.

The earlier alpha version of the app (thanks everyone for testing it) ran against a test instance of the official cwa test server. However, in practice the test server works slightly differently to the real thing. Therefore I'm afraid I can't offer any guarantee that the app will work as expected; please bear this in mind. It's also likely to affect your phone's battery life.

You use it at your own risk I'm afraid.

Having said that, if you discover it's not working as expected, or even if it is working as expected, please let me know or file a bug report.

Because the app requires Bluetooth 4.1 or later, it's unfortunately not compatible with Jolla 1 or Jolla C devices. I've also had reports it has problems on the Xperia X, but it should work on the later X devices.

Installing the app will install a background service that will continue to scan/broadcast even if you close the app. The service is stopped and uninstalled when you remove the app.

The source is available on github. PRs are welcome!

The 0.7.10-1 version of the app in the repo is built to be compatible with Sailfish OS 4.5.

Application versions: 
File harbour-contrac-0.0.1-1.armv7hl.rpm229.23 KB30/07/2020 - 22:54
File harbour-contrac-0.1.1-1.armv7hl.rpm236.98 KB09/08/2020 - 14:54
File harbour-contrac-0.2.1-1.armv7hl.rpm242.29 KB22/08/2020 - 16:52
File harbour-contrac-0.3.1-1.armv7hl.rpm244.41 KB24/08/2020 - 16:06
File harbour-contrac-0.4.1-1.armv7hl.rpm251.26 KB01/09/2020 - 18:49
File harbour-contrac-0.5.1-1.armv7hl.rpm274.71 KB07/09/2020 - 00:11
File harbour-contrac-0.6.1-1.armv7hl.rpm607.78 KB14/09/2020 - 23:10
File harbour-contrac-0.6.2-1.armv7hl.rpm607.89 KB16/09/2020 - 23:27
File harbour-contrac-0.7.1-1.armv7hl.rpm615.53 KB04/10/2020 - 18:54
File harbour-contrac-0.7.2-1.armv7hl.rpm622.56 KB05/10/2020 - 00:54
File harbour-contrac-0.7.3-1.armv7hl.rpm622.98 KB08/10/2020 - 20:30
File harbour-contrac-0.7.4-1.armv7hl.rpm622.87 KB08/10/2020 - 23:28
File harbour-contrac-0.7.4-2.armv7hl.rpm624.79 KB14/10/2020 - 00:08
File harbour-contrac-0.7.5-1.armv7hl.rpm619.87 KB02/01/2021 - 01:58
File harbour-contrac-0.7.6-1.armv7hl.rpm616.87 KB31/01/2021 - 18:45
File harbour-contrac-0.7.7-1.armv7hl.rpm619.45 KB17/02/2021 - 00:49
File harbour-contrac-0.7.10-1.armv7hl.rpm665.6 KB02/02/2023 - 22:56
File harbour-contrac-0.7.10-1.aarch64.rpm689.7 KB02/02/2023 - 22:56
File harbour-contrac-0.7.10-1.i486.rpm727.26 KB02/02/2023 - 22:56

* Thu Feb 2 2023 David Llewellyn-Jones <> 0.7.10-1
- Change quazip-devel naming for Sailfish OS 4.5 target.
- Add make as a build requirement.

* Sat May 14 2022 Oskar Roesler <> 0.7.9-1
- Require Qt Linguist pkg for tranlations. (#115) This package is preinstalled on the SDK, but not on OBS.
- Add chum information to rpm spec file

* Mon May 09 2022 Oskar Roesler <> 0.7.8-2
- Add LICENSE as stated in

* Sat May 07 2022 Oskar Roesler <> 0.7.8-1
- Remove the YAML spectacle file #96
- Set OpenSSL 1.1.1 as the default build option #97
- Add notifications for important events #98
- Scan the QR-code containing the GUID. #105
- F performance improvements #107
- Code refactoring DayStorage::findDtkMatches #108
- Build against #109
- Disable sailjail sandboxing #110

* Sun Feb 14 2021 David Llewellyn-Jones <> 0.7.7-1
- Store settings periodically to avoid data loss on unclean exit
- Code formatting tidied up with clang-format
- Improve start up failure handling
- Fix erroneous desktop-file-uninstall from uninstall process
- Tidy up build configuration
- Support automatic daily download of diagnosis keys
- Added Oskar Roesler (bionade24) as a contributor

* Sun Feb 16 2021 David Llewellyn-Jones <> 0.7.7-1
- Store settings periodically to avoid data loss on unclean exit
- Code formatting tidied up with clang-format
- Improve start up failure handling
- Fix erroneous desktop-file-uninstall from uninstall process
- Tidy up build configuration
- Support automatic daily download of diagnosis keys
- Added Oskar Roesler (bionade24) as a contributor

* Sun Jan 31 2021 David Llewellyn-Jones <> 0.7.6-1
- Download daily, rather than hourly, diagnosis key archives.
- Allow selection of key region for downloads (DE or EUR).
- Improve download progress precision.

* Fri Jan 1 2021 David Llewellyn-Jones <> 0.7.5-1
- Move risk calculation to a separate thread.
- Fix calculation to improve accuracy.
- Decouple calculation update from user interface app.
- Note the calculation now takes considerably longer.

* Thu Oct 8 2020 David Llewellyn-Jones <> 0.7.4-1
- Fix BLE state machine to allow graceful restart when filtering isn't supported.

* Thu Oct 8 2020 David Llewellyn-Jones <> 0.7.3-1
- Fix BLE state machine to allow graceful shutdown when filtering isn't supported.

* Sun Oct 4 2020 David Llewellyn-Jones <> 0.7.2-1
- Attempt to download data only from last 14 days (to avoid an error from day 15).

* Sun Oct 4 2020 David Llewellyn-Jones <> 0.7.1-1
- Updates the Chinese translations, thanks to dashinfantry.
- Updates the German translations, thanks to spodermenpls.
- Switches to using the official Corona-Warn-App servers.
- Uses the server REST API rather than the S3 protocol for diagnosis key downloads.
- Allows network errors to be cleared by clicking on the label.
- Adds an info banner to the main app, warning that functionality isn't guaranteed.
- Old diagnosis key downloads are cleaned up if they're over 15 days old.
- Calculates the need for fresh downloads at startup based on cached folders.
- Performs the Corona-Warn-App specific "combined risk score" calculation.
- Uses the low/high risk threshold configuration downloaded from the server.

* Wed Sep 16 2020 David Llewellyn-Jones <> 0.6.2-1
- Updates the Chinese translations.
- Fixes a timing bug so that an update can now be performed every day.

* Mon Sep 14 2020 David Llewellyn-Jones <> 0.6.1-1
- Adds new Chinese translations.
- Adds an improved cover page with status and actions.
- Improves the About page, which now includes contributors.
- Adds support for configuring the device attenuation values.
- The risk configuration is downloaded from the Corona Warn App servers.

* Sun Sep 6 2020 David Llewellyn-Jones <> 0.5.1-1
- Diagnosis key files are now tested directly after download.
- The risk status is shown in the UI, along with other useful info.

* Tue Sep 1 2020 David Llewellyn-Jones <> 0.4.1-1
- Adds encrypted beacon metadata send/receive.
- Refines the data aggregation algorithm to give improved results.
- Adds unit tests for metadata, metadata validity and data aggregation.
- Improves the beacon matching unit tests.

* Mon Aug 24 2020 David Llewellyn-Jones <> 0.3.1-1
- Adds persistent state to contracd.
- Send/received counts are now persistent.
- The enabled state of scanning/advertising is now persistent.
- The SIGINT signal is now handled by contracd.
- Diagnosis keys are now available for upload without needing to enable scan/receive.

* Sat Aug 22 2020 David Llewellyn-Jones <> 0.2.1-1
- Adds TeleTAN submission by the user.
- Adds separate pages to show upload and download progress.
- Improves error reporting for uploads and downloads.
- Streamlines the main page to remove progress indicators and add a status line.

* Sun Aug 9 2020 David Llewellyn-Jones <> 0.1.1-1
- Supports diagnosis key downloads from the test server.
- Supports diagnosis key upload to the test server.
- Adds a setting page for configurating the sever to use.

* Tue Jul 7 2020 David Llewellyn-Jones <> 0.0.1-1
- Initial alpha release.
- Supports beacon scan and send.


Klaas's picture

I wonder what data go to Google. Metadata?

flypig's picture

There's no data (or metadata) that goes to Google at all. If you enter a TeleTAN from a positive test result, your keys will be uploaded to the servers run by Deutsche Telekom/SAP for the German governmment, but the keys are essentially random numbers as far as the government is concerned. The protocol's designed to be privacy-preserving. It's not perfect, but my personal view is that it's pretty good.

michl's picture

Tested on Fxtec Pro1 and it's working! :-)

Immediatelly after activating it, it sended one message an received 2 messages from the 2 pebble watches. After a stroll through the town, that lasted about half an hour, it received over 300 messages.

Thank you for that work!



flypig's picture

It's great to hear it's working on the f(x)tec; full credit to the porters for their amazing bluetooth work.

pvcn's picture

Diagnosis Key upload and download seem to work (Xperia X Compact), but show wrong date: I uploaded/downloaded today (August 10th), App shows "up to date" and August 9th as date.

flypig's picture

Thanks for testing this, and for the info about the wrong date. Is it the upload or download that states the wrong date (or both)? Could it be to do with your timezone depending on what time you were checking (e.g. if your date was different to UTC)?

pvcn's picture

It was both upload and download that showed wrong day. As i didn't up-/download at midnight, it should have nothing to do with the timezone. Since latest updates, the Button "Download latest keys" results "Network error" (I have no WLAN for a few days and use Mobile Data),

melvin's picture

Is it possible to use the official cwa servers with the new update? If yes, what are their IP addresses?

flypig's picture

Not yet I'm afraid. There are a couple more pieces of implementation needed, plus I don't yet have the official servers' addresses. It's slower than I'd like too, but there are many pieces that need to fit together and I'll continue releasing versions as it progresses. In the meantime, if you notice any issues with the test servers, that would be really useful to know about.

tmojo's picture

Have your app running now for several days and the counters for sent and receiced keys increased over the time, even when app UI was closed. So this seems to be working alright.
Today I had to restart my phone, due to AlienDalvik issues. After the restart the xounter says 1 beacon sent, 0 received. Does that mean the app looses all its beacon on reboot?

flypig's picture

Yeah, the counters are reset when you restart the device, but the captured keys are still stored. If you look in ~/.config/contracd/contacts you should find a bunch of files (two per day) storing the beacons you've received. It's roughly 20 bytes per beacon in the .dat files, so you can get an idea how many have been captured overall from the filesize.

I'm glad to hear it's running alright for you. Which device are you using?

meegouser's picture

"Because the app requires Bluetooth 4.1 or later, it unfortunately isn't compatible with Jolla 1 or Jolla C devices"

That's a bummer, since the Jolla Phone is still my only Sailfish device (apart from the Jolla Tablet, which is a bit too bulky to carry in my pocket). It is always said that "Bluetooth Low Energy", introduced with BT 4.0, is the base requirement for the (official) Corona-Tracking app, which the Jolla Phone does have implemented. So which necessity does BT 4.1 provide, that 4.0 doesn't?

flypig's picture

It is a bummer, and it's a good question too. The Jolla 1 has bluez 4 with a different interface for BLE to bluez 5 on later devices, so getting that to work (if possible at all) would be quite a challenge. The particular danger is that it would be time-consuming work for potentially no good outcome.

The Jolla C has bluez 5, so it's more tractable, but the short answer here is that I tried it out and it didn't work. It's possible It could be made to work with changes to the implementation.

The longer answer is that when I tested, bluez reported that it supported only a single broadcast beacon at a time. This meant that when I rotated the key for the second beacon, the broadcast request returned an error (even though I'd de-registered the first). But that's not the whole story, because I wasn't able to pick up any beacon from the first request, even though there was no error indicated for that one.

I'd love to support all devices and I created an issue for this on github; if someone who knows more about bluetooth is interested to look deeper I'd be very pleased:

pvcn's picture

Yes, i also wrote you a Mail. After one Day, the App shows "Sent: 170, Receiced: 39" now

flypig's picture

Great, thanks for letting me know! The fact it's picking up beacons from others is a good sign. Next I'll need to activate the code that allows you to download keys from the central server to test whether those keys belonged to anyone who subsequently tested positive.

nobodyinperson's picture

Obviously, audio playback via bluetooth gets very stutterish when having "Scan and send active" selected.

flypig's picture

That's useful to know. It may be that this can be improved by regulating the frequency of broadcasts and scanning, but that's something I've not had a chance to explore. Could you please post an issue to github?

nobodyinperson's picture

Maybe you should add a hint to systemctl --user enable --now contracd. Otherwise, the GUI won't do anything, at least not in my case.

flypig's picture

Hmmm. This shouldn't be necessary, it should automatically start. I'll look into it. But that's good advice if it doesn't.

lispy's picture

Eagerly waiting for this app. Corona Warnapp would be key for this german family.

flypig's picture

Thanks, it's good to know there's interest and I hope this will turn out to be useful to you. Right now it's not an alternative to the official app, because not everything is implemented, but the hope is that it will be eventually.

pvcn's picture

Sorry to bother you with another question: Does this app run in the Backround or do i have to keep it open? Do i have to start it after every reboot? Thanks and regards Peter

flypig's picture

The app will run in the background (I'll add a note to the description about that), so you can close the app and it'll continue sending and receiving. However, if you reboot, you'll need to turn it on again, because I haven't yet implemented persistent settings.

pvcn's picture

Thank you very much, i'm from Germany and would like to test. I use an Xperia X Compact with a patched Version of SFOS for Xperia X, i hope it will work. Do i have to keep GPS activated for this App to Work?

flypig's picture

Thanks, your help would be really appreciated (did you also email me by the way?). It will be good to know if it works on an X Compact. There's no need to activate GPS, but it does require Bluetooth to remain active.

melvin's picture

Thank you so much for your work! I'd love to help and test - I'm from Germany with much human contact!

flypig's picture

Great! That sounds perfect :) Please do try it out, but bear in mind the warnings that it's still work-in-progress, so you should probably continue using the official app for the timebeing if you need the functionality. Please let me know how you get on.

objectifnul's picture

Please see the description of the app, first sentence.

flypig's picture

Ah, yes, I misunderstood. Thanks again, I fixed it now :)

objectifnul's picture

Perhaps "contact" would make more sense than "contract".