New Releases

Version 0.12.0 Release

Service configuration and monitoring

Release banner showcasing new UI

Highlights

  • You can now change the settings of your services — this includes changing subdomains!
  • Monitor your server’s CPU, Network and RAM usage with the stats from your server itself.
  • You can now see the memory consumption of your services.
  • Recovery process now allows you to skip the provider token during recovery.
  • View system logs from the app, without SSH.
  • Jobs statuses (such as server rebuilds) are now updated in real time.

Changelog

Features

  • Enabled the following languages:

  • Monitoring: You can now view CPU, Network and RAM stats from the server (#532)

  • Recovery: You can now skip the server provider token during recovery (#532, a step towards resolving #450)

  • Recovery: Allow setting the provider token after the recovery (#532)

  • Providers: You can now view the provider tokens status (#532)

  • UI: Add a notification if the app doesn’t support the server API version (#531)

  • Server: Server logs screen (#531, resolves #521)

  • Services: Allow viewing service logs from the service screen (#532)

  • Services: Service settings (#531)

  • Update DNS records after actions that potentially require DNS changes (#531, resolves #523)

  • Use Websockets to update server jobs status (#529, resolves #522)

  • UI: Allow selecting text from Markdown articles (#524, resolves #470)

  • Console: Obscure auth headers from console logs (#482)

  • Jobs: Implement NixOS garbage collection job (#506)

  • UI: List Tiles now have a circular border. (#482, resolves #463)

  • Settings: Added language picker to the settings (#482, resolves #489)

  • UI: Show the error screen when secret storage fails to load (#504)

  • Console: Added an empty view when there are no logs in console yet. (#482, resolves #492)

  • Backups: Show how much space a service uses on backup (#500, resolves #434)

  • Installation: Add country names to installation process (#501, resolves #494)

  • Console: Reworked app console. (#482)

  • UI: Infobox draws itself in a single row if there is enough space. (#482)

  • Services: You can now copy a link on the service page (#461, resolves #452)

  • Services: You can now open the service screen by tapping the service disk usage card (#446)

  • Installation: Remove the “I already have a server” button after starting the installation (#497, resolves #414)

Bug Fixes

  • UI: Remove black bars on top of some pages (#531)
  • UI: Fix missing server settings page title (#482, resolves #510)
  • Docs: Update the manual on how to get token from the SSH (#509, resolves #471)
  • Packaging: Flatpak builds didn’t work (#504)
  • Devices: The new device key can now be selected and copied. (#482)
  • UI: Fixed scrollbars on desktop builds. (#482)
  • Backups: Filter disabled services from create backups screen (#499, resolves #433)
  • UI: Add a subtitle for the “Jobs list” button (#462)
  • Docs: Digital Ocean DNS used wrong manual

Translation contributions

  • Polish

    • Thary (3)
  • Ukrainian

    • TabithiS (39)
  • Estonian

    • Dmitri B. (35)
  • Japanese

    • shirahara (566)
  • Kazakh

    • TabithiS (509)
  • Russian

    • Thary (2)
    • NaiJi ✨ (10)
    • Inex Code (82)
  • Belarusian

    • Thary (33)
    • misterfourtytwo (28)

Patch 0.12.1

Features

  • Accessibility: Add screen reader descriptions for graphs (#554)
  • Jobs: When Jobs websocket subscription disconnects, fall back to usual queries for two minutes (#550, resolves #542)
  • Metrics: Implement disk usage metrics (#538)
  • Developer settings: Add server info to developer settings (#560)

Bug fixes

  • UI: Disk chart had too many horizontal grid lines (#560)
  • UI: Progress bar used the same shade of gray regardless of user preferences (#560)
  • UI: Onboarding views were getting out of safe area (#560)
  • App console: When app logs are paused, on incoming queue overflow, the main buffer was cleaned up instead (#560)
  • Installation wizard: Implement better error messaging for providers token check (#558, resolves #508)
  • Server logs: Show server logs timestamps in a local timezone (#552, resolves #540)
  • Backups: Backups encryption key couldn’t load (#551, resolves #543)
  • Services: Make text gray for disabled service options (#549, resolves #544)
  • Services: Do not show the service link for disabled services (#548, resolves #547)
  • Jobs: Open the jobs screen when starting the system garbage collection (#560, resolves #541)

Translation contributions

  • Russian

    • NaiJi ✨ (1)
    • Inex Code (70)
  • Estonian

    • Dmitri B. (65)

Patch 0.12.2

Vulnerability disclosure

This release contains a fix for a security vulnerability. We recommend updating as soon as possible.

UnblvR discovered that the application used an insecure random number generator. This could allow an attacker to predict the random numbers generated by the application, which could lead to a variety of security issues.

While we believe the risk of exploitation is low, we recommend that you update the token on your original device:

  1. Update the app to the latest version.
  2. Go to the Devices screen at the “More” section.
  3. Make sure that your device is named “Initial device”. If it’s not, do the steps on that initial device instead. If you don’t have access to that device anymore, revoke the access for that device by tapping it in the list below.
  4. Tap on the “Initial device”. The app will ask you if you want to refresh the token. Tap “Confirm”.

Only the token of the initial device might be vulnerable. Tokens of other devices and backups encryption key are generated by your server with a secure random number generator.

Servers created with this version and newer will not be vulnerable to this.

We would like to thank UnblvR for the responsible disclosure of the vulnerability.

Features

  • Allow refreshing device token for Server API (#565)
  • Upgrade Flutter to 3.24.0 (#562)

Bug fixes

  • i18l: Resolve word puzzles (#566)
  • Use the cryptographically secure random number generator (#565)
  • Remove hardcode for recovery support articles (#563, resolves #251)
  • Volume resize function didn’t work due to logical error

Translation contributions

  • Estonian

    • Dmitri B. (9)
  • German

    • Philipp Weiermann (23)
  • Russian

    • Inex Code (24)

Patch 0.12.3

Features

  • Dynamic icons for Android (#585, resolves #584)
  • DNS: Handle CAA records (#588, #589)
  • i18n: Enable Italian (#593)
  • Add new backups card descriptions (#595, resolves #587)
  • Added skeleton loaders to several screens (#589)

Bug Fixes

  • recovery: Check server location on the recovery of the server selection step
  • ui: Many different UI fixes (#589)
  • ui: Backup timestamps are now in local timezone.
  • ui: Fix hero icon position on mobile screens with cutouts (#589)
  • ui: Follow MD3 guidelines regarding FABs on NavigationRails (#589)
  • Change console timestamps to 24h format (#596, resolves #571)
  • ui: Add a note regarding digital ocean email limitations. (#600, resolves #599)
  • Hotfix for Cloudflare API changes (#604)
  • ui: Remove Expanded wrapper for the warning about disabled SSH (#572, resolves #568)
  • logs: Implement json encode error handling (#570, resolves #569)

Translation contributions

  • Estonian

    • Dmitri B. (20)
  • Italian

    • Genio (671)
  • Japanese

    • shirahara (125)
  • Russian

    • Inex Code (13)
  • Slovenian

    • 22nds (39)

Version 0.11.0 Release

New About screen, reworked jobs management

Changelog

Features

  • Enabled the following languages:

    • Arabic
    • Estonian
    • Kazakh
    • Chinese (Simplified)
  • Server management: Add ssh settings (#477)

  • UI: Server settings is now a separate screen (#477)

  • UI: The new About page now contains links to our support channels (#464, resolves #339 and #170)

  • Jobs: Now you can track the result of jobs, and the progress of the server rebuilds and upgrades (#440, resolves #254)

  • UI: On iOS, use the Curpentino bottom navbar (#483)

  • UI: Use Curpentino widgets where possible on iOS (#483)

  • Jobs: Block starting client-side jobs when the server is rebuilding or moving a service (#477)

  • UI: On the bottom bar, show all labels, not only the selected one (#458, resolves #454)

  • UI: Move provider card titles to the top row (#449, resolves #448)

  • Unified management of API connection to the server: the app should be now more reactive to changes (#440)

  • UI: Onboarding page now looks better on big screens (#444)

Bug Fixes

  • UI: Card titles no longer overflow on small screens (#483, resolves #476)
  • DNS: Detect the situation when we have faulty link-local IPv6 records (#473)
  • DNS: Do not include faulty link-local DNS records in the list of found records (#475)
  • UI: Fix the empty server confirmation screen during recovery (#474)
  • UI: Fix the misleading value of “Do not verify TLS” (#468)
  • Jobs: When you return the server settings value back, the job to change the setting is deleted (#440, resolves #166)
  • Jobs: When removing all completed jobs, optimistically delete them in UI first (#440, resolves #277)

Other

  • Binds migration screen is now in Developer settings, as it is no longer needed on API 3.0, but might still be helpful for stuck servers.
  • Remove the server deletion function (#484)

Translation contributions

  • Kazakh

    • TabithiS (133)
  • Chinese (Simplified)

    • Nil (545)
  • Polish

    • TabithiS (52)
  • Russian

    • Inex Code (43)
  • Hebrew

    • Yaron (17)
  • Estonian

    • Dmitri B. (536)
  • Thai

    • Inex Code (2)
  • German

    • Inex Code (14)
      • Based on anonymous suggestions
  • Ukrainian

    • Nagibator Nagibuchiy (18)
    • TabithiS (26)
    • Meko (93)
  • Arabic

    • Deem Alosili (656)

Version 0.10.0 Release

Migration to the new NixOS version

Changelog

Features

  • Server installation: New NixOS version is used during server setup (#415)
    • It is also possible to set a root SSH key during server setup. This feature can be activated in developer settings.
  • DNS management: DNS records creation dynamically gets desired records from the server now (#424, resolves #265)
  • UI: Add the button to copy password on the new user creation screen (#409, resolves #299)
  • UI: Add animation to the recovery key screen (#410, resolves #164)
  • Backups: Bucket name now includes the date of creation (#403, resolves #263)
  • UI: Snapshots List page now shows the button to open the Jobs sheet (#396, resolves #290)
  • Server installation: Implement better domain ownership check during installation (#394, resolves #389)
  • UI: Implement flexible precision formatting for prices (#387)

Bug Fixes

  • UI: Domain name no longer overflows the screen (#422, resolves #408)
  • UI: Fix overflow of the filled buttons
  • Hetzner: Filter away ARM architecture from available servers (#404, resolves #402)
  • UI: Add refresh indicator on the ‘Devices’ screen (#398, resolves #258 and #163)
  • GraphQL API: Force DateTime to UTC when timezone naive (#386, resolves #385)

Other

  • Updated the copyright year (#417)
    • Happy new year!
  • Upgrade to Flutter 3.16.1
  • Rename the Recovery flow button to prevent user confusion (#399, resolves #346)
  • GraphQL API: Remove and replace deprecated mutations (#423, resolves #418)

Translation contributions

  • French

    • smtg (12)
  • Spanish

    • NaiJi ✨ (35)
  • German

    • Marvin F (23)
    • User 1234 (30)
  • Hebrew

    • Yaron (578)
  • Russian

    • def (4)
    • NaiJi ✨ (9)
    • Inex Code (10)

Version 0.9.0 Release

Backups, DeSEC DNS and more!

Release banner showcasing new UI

Changelog

Features

  • New backups implementation (#228, #274, #324, #325, #326, #331, #332)
  • DeSEC as a DNS provider (#211)
  • DigitalOcean as a DNS provider (#213)
  • Support drawer and basic support documentation logic unit (#203)
  • Automatic day/night theme (#203)
  • New router and adaptive layouts (#203)
  • New Material 3 animation curves (#203)
  • Add jobs button to the app bar of more screens (#203)
  • Refreshed UI of modal sheets (#228)
  • Support for XDG_DATA_HOME storage path on Linux for app data (#240)
  • Accept-Language header for the server API (#243, resolves #205)
  • Visible providers names during server recovery (#264, resolves #249)
  • Volume and IPv4 cost added to overall monthly cost of the server (#270, resolves #115)
  • Support for autofocus on text fields for keyboard displaying (#294, resolves #292)
  • New dialogue to choose a domain if user DNS token provides access to several (#330, resolves #328)
  • New app log console (#203)

Bug Fixes

  • Fix opening URLs from the app (#213)
  • Fix parsing of RAM size with DigitalOcean (#200, resolves #199)
  • Devices and Recovery Key cubits couldn’t initialize right after server installation (#203)
  • Fix BottomBar showing incorrect animation when navigating from sibling routes (#203)
  • PopUpDialogs couldn’t find the context. (#203)
  • Update recovery flow to use new support drawer (#203)
  • Improve installation failure dialogues (#213)
  • Privacy policy link pointed at wrong domain (#207)
  • Remove price lists for DNS (#211)
  • Implement better domain id check on DNS restoration (#211)
  • Add forced JSON content type to REST APIs (#212)
  • Remove unneded DNS check depending on CLOUDFLARE (#212)
  • Add background for dialogue pop ups and move them to root navigator (#233, resolves #231)
  • Make currency be properly shown again via shortcode (#234, related to #223)
  • Add proper server type value loading (#236, resolves #215)
  • Implement proper load functions for DNS and Server providers (#237, resolves #220)
  • Prevent moving a service if volume is null for some reason (#245)
  • Replace hard reset from server provider with direct server reboot (#269, resolves #266)
  • Normalize Hetzner CPU usage percentage by cached amount of cores (#272, resolves #156)
  • Change broken validations string for superuser SSH (#276)
  • Don’t let service migration to start if the same volume was picked (#297, resolves #289)
  • Wrap DNS check in catch to avoid runtime crash (#322)
  • Implement Backblaze bucket restoration on server recovery (#324)

Refactor

  • Migrate to Flutter 3.10 and Dart 3.0
  • Migrate to AutoRouter v6 (#203)
  • Get rid of BrandText and restructure the buttons (#203)
  • Remove brand alert dialogs and bottom sheet (#203)
  • Remove unused UI components (#203)
  • Remove BrandCards (#203)
  • Allow changing values for TLS settings
  • Replace String shortcode with Currency class (#226)
  • Rearrange Server Provider interface (#227)
  • Remove unused service state getters (#228)
  • Remove unused utils, add duration formatter (#228)
  • Move rest api methods according to their business logic files positions (#235, partially resolves #217 and #219)
  • Make flag getter a part of server provider location object (#238, resolves #222)

Translation contributions

  • Ukrainian

    • FoxMeste (3)
    • Mithras (31)
  • Latvian

    • Not Telling Lol (183)
  • German

    • Mithras (41)
    • FoxMeste (213)
  • Thai

    • FoxMeste (77)
  • Polish

    • Mithras (41)
    • Thary (43)
    • FoxMeste (163)
  • Slovenian

    • Mithras (212)
  • Czech

    • NaiJi ✨ (2)
    • Mithras (109)
    • FoxMeste (308)
  • Russian

    • FoxMeste (4)
    • Revertron (8)
    • NaiJi ✨ (23)
    • Mithras (54)
    • Inex Code (59)
  • Slovak

    • Mithras (29)
    • Revertron (396)
  • Macedonian

    • FoxMeste (7)
  • Belarusian

    • Thary (1)
    • FoxMeste (3)
    • Mithras (47)
  • French

    • Côme (211)
  • Spanish

    • FoxMeste (7)
  • Azerbaijani

    • Mithras (28)
    • Ortibexon (403)

Patch 0.9.1

Bug Fixes

  • Fix volume resizing on Digital Ocean (#368, resolves #367)
  • Disable the storage card while volume information is being fetched (#369, resolves #317)

Features

  • Add copy-to-clipboard for email on user page (#329, resolves #287)
  • Add support for ECDSA SSH keys (#362, resolves #319)
  • Implement confirmation modal for the volume resize (#372, resolves #308)

Other changes

  • Move service descriptions above login info for service cards (#342, resolves #341)
  • Add measure units to ‘Extending volume’ page (#344, resolves #301)
  • Make users to be ordered properly on users page (#343, resolves #340)
  • Move service card name to its icon row (#352, resolves #350)
  • Reorganize placeholders for empty pages (#359, resolves #348)
  • Remove redundant zone id cache for Cloudflare (#371)

Version 0.8.0 Release

Digital Ocean support, new setup UI, and more!

Release banner showcasing new UI

Changes

Server setup:

  • Added support for Digital Ocean as server provider
  • You can now choose server region
  • You can now choose server tier
  • Server installation UI has been refreshed
  • Fields now have more specific error messages

Common UI:

  • New app bar used in most of the screens

Services:

  • Services are now sorted by their status

Server settings:

  • Timezone search screen now has a search bar
  • Fixed job creation when switching the setting multiple times
  • Server destruction now works

Jobs:

  • Jobs panel now should take slightly less space

Auth:

  • Recovery key page can now be reloaded by dragging down

Logging:

  • Log console now has a limit of 500 lines
  • GraphQL API requests are now logged in the console
  • Networks errors are better handled

For developers:

  • App now only uses GraphQL API to communicate with the server. All REST API calls have been removed.
  • Server can now be deployed with staging ACME certificates
  • Language assets have been reorganized

Translations:

  • Added translation for Ukrainian
  • Also activated unfinished translations for German, French, Spanish, Czech, Polish, Thai

Version 0.7.0 Release

Monitor disk space usage, move services between volumes, expand server capacity, and more

Release banner showcasing new UI

Changes:

  • Monitor disk space usage, move services between volumes, expand server capacity.
  • New redesigned server details screen.
  • User management screens were redesigned too, and you are able to reset users’ passwords now.
  • Automatic update settings and server’s timezone can be changed now.
  • Initial support for SelfPrivacy API 2.0, powered by GraphQL.
  • User list synchronization bugs are fixed.
  • App is now able to track some types of the long-running jobs which are performed on the server itself.
  • Basic support for the new API’s service management.
  • Backups screen is temporarily removed, until we fix it.
  • Minor UI changes.
  • Minor bug fixes, architectural changes.

Migration to the new disk management system

We’ve introduced a new system to control where your services’ data is stored, but an initial migration is needed. Without it, you won’t be able to move services between volumes.

We highly encourage you to manually back up your data from the server before migrating.

To use the new disk management features properly you have to perform the migration. Go to the “More” tab and tap on the “Start migration” button. This migration is also known as “binds migration” in our internals, and you may see this term if you encounter an error related to this system. If you do, please report it to us, and we will help.

Our own F-Droid repo, nightly builds and desktops

From now on, our app also deployed on our own F-Droid repository, allowing you to get our builds faster.

https://fdroid.selfprivacy.org

This repository contains two apps: SelfPrivacy and SelfPrivacy Nightly. The first one contains release builds, and the second one is for development builds. They may contain bugs, but will allow you to test our new features before release. All three Android builds (Official F-Droid, our own F-Droid and Nightly) are independent and can be installed simultaneously.

You can also try out our experimental desktop builds, available for Linux as Flatpak, Windows and macOS. https://git.selfprivacy.org/kherel/selfprivacy.org.app/releases/tag/0.7.0 Please keep in mind that we cannot guarantee that the app will launch on your distro, and that we have not adapted our UI for desktops yet.

Version 0.6.0 Release

Use SelfPrivacy on several devices

Changes:

  • Added support for server access from SelfPrivacy apps installed on several devices.
  • You can now create recovery token to regain the access to the server if you lose your device or the app’s data.
  • You can now connect to an existing server, instead of creating a new one.
  • Initial support for Material Design 3 (Material You).
  • App now uses your system colors on Android 12 (Material You), Windows 10 (accent color) and Linux (GTK colors). While SelfPrivacy works ok on desktops, we won’t officially release desktop versions until we refactor our UI to support big screens.
  • Minor bug fixes.

Version 0.5.0 Release

Manage SSH keys and check reworked DNS management screen

Changes:

  • DKIM key is now deployed to DNS during server setup.
  • Step 1 of server setup (DNS checks) is now faster.
  • New DNS management screen: checks current records and lets recreate them if something is wrong.
  • User creation and deletion is now more responsive.
  • User list is now synchronized with the server.
  • New SSH key management screen. SSH keys can now be uploaded for any user, including root.
  • Root SSH key generation is removed, you can now upload your own keys.

SelfPrivacy Blog

There would be no room for conflict if everyone in the world could exchange ideas without being watched

Tessel Renzenbrink and Ronnie Lam spoke to Kirill Zholnay and lead full-stack engineer Inex Code about the need for user autonomy, their crush on Deltachat, NixOS, the joy of receiving positive feedback and how SelfPrivacy is financed.

SelfPrivacy aims to make self-hosting accessible to non-technical users. Born out of a dream to enable every person on the internet to live free of Big Tech surveillance, it provides a simple solution to set up and manage your own server.

Tessel

Welcome to the NGI Zero podcast, where we talk to the people who are building the next generation internet.

Ronnie

Hi, I'm Ronnie Lam.

Tessel

And I'm Tessel Renzenbrink.

Tessel

We're both from NLnet, a foundation which supports people who are working on a free and open internet.

Our guests today are Kirill Zholnay and Inex Code.

Kirill is the founder of LoRaType, a text messenger device using LoRa radio to communicate so you can chat independent of the internet. He's also the founder of SelfPrivacy, the project funded by NGI Zero we will be speaking about today.

Inex Code is the lead full-stack engineer at SelfPrivacy.

SelfPrivacy is a free application that helps you set up and manage your self-hosted services. The goal is to create an accessible tool that gives everyone the opportunity to create their own self-hosted infrastructure.

Hi Kirill and Inex, welcome.

Kirill

Hello everybody, how are you?

Tessel

If we talk about the internet, what are the key issues that you see today with the internet?

Kirill

Oh, I am mature enough to remember the internet in the 2000s. Back then it was academic and decentralized, not commercial and centralized. It was about sharing information and not controlling users. Big tech didn't track your every move. Today the biggest problem is lack of privacy and it's getting worse. On the bright side, the European Union has improved things with GDPR, but it's unclear how well big tech is following the rules.

As a system engineer, I think even if you ask your data to be deleted, it will remain in backups and cold storage. There are also negative trends such as chat control.

Tessel

And how does SelfPrivacy contribute to addressing those issues?

Kirill

When ordinary users realize they are being tracked, they seek ethical services. Not so bad, they switch to another big tech company, maybe more ethical, but still centralized like Matrix, Signal, Proton, Tuta. In the best case, they discover open source self-hosting, but it's too hard to set up and maintain these services securely. Even for experienced IT professionals, we make self-hosting painless. SelfPrivacy's main goal is to enable ordinary users to own their private services without relying on big tech.

Tessel

And how do you offer this service? What does it look like?

Kirill

In IT terms, our project is like Ansible and Terraform combined into an easy-to-use app. Users simply sign up to the same service providers that professional system admins use. It's virtual server providers, DNS servers, and backup storage.

SelfPrivacy is not a service provider. We don't have any information about or access to the user's server. We know nothing about them. Our application is basically a set of scripts that set up, configure, and update user's server.

Tessel

Okay, and so I was looking at it, and I really like the idea of having a lot of support from you to set up the self-hosting. And you tell me, as a system engineer, that you will not be able to see my data or my credentials, but how do I, as a non-technical person, know that it's true? You say you work with zero trust, but how can I verify that you don't know my stuff?

Kirill

Inex, do you want to say something?

Inex

It's an interesting question. First of all, we don't have any access to your server. Our application doesn't send any information to us. While the server downloads from our server the configuration for the server, the module is to set up all the services. These are all the same for everyone. If you have the skills to check the NixOS code, you can read it.

Tessel

Yeah, so even if I personally can't check it, I can ask somebody who understands, who can read the code, to check it for me?

Inex

Yes, like everywhere in the open source.

Kirill

You can remove our application and use your server without us. You can update your server manually if you want. You don't need SelfPrivacy for it.

Tessel

Yeah, thanks. That answers my question.

You just mentioned [NixOS](https://nixos.org/). Can you tell me a bit more about the NixOS ecosystem?

Inex

NixOS is a declarative operating system based on the [package manager Nix](), which allows us to declare all the system configuration and service configuration in one place. As it is powered by a Nix programming language, we were able to adapt the single configuration to address the needs of different users.

We have a single Nix config, which loads the data of the user, like which services users want to launch, which configuration values does the user want, and using Nix language, we can modify the system without modifying the Nix files themselves on the user's machine. There are a lot of projects that are like ours. They try different approaches. There are projects like YunoHost. They use Debian installation scripts and stuff like this, like in the usual style of how things on Linux are done.

There are projects that use Docker, Kubernetes, and other container systems. And when the project started, we saw that and we tried to do this using NixOS. Because initially, SelfPrivacy was a hackathon project, so we tried to do this with Kubernetes, and it ended up badly.

So, as I know, we are the only project that tries to achieve this goal using Nix, and it is not easy. As for now, we see that if we try to use different approaches that are used by other projects, in many ways, it will be easier to implement, but advantages of using NixOS came out to be quite dramatic for us. And we are still sticking to this.

We are trying to do stuff that wasn't done yet in this ecosystem. I think we are doing quite good at this.

Kirill

Shortly, we hate Docker and Kubernetes.

Ronnie

We hear that a lot.

How do you handle updates? As a user, do I need to log in to the server itself? Or will that be done from the app front-end?

Inex

There are two options. If you have automatic updates enabled, your server will update itself every day. If you disabled automatic updates, you will have to open the app and click a big shiny button, update server. And that's it. You will see the progress with the recent updates that we will release this week. You will see in real time the process of NixOS rebuilds.

Ronnie

And that also handles major revisions of NixOS?

Inex

Could you please repeat?

Ronnie

And that also handles major revisions of NixOS like 23.11 to 24.05?

Inex

Well, previously, major releases of NixOS were such a pain for us because we had to switch channels. And it's not something you can quite automatically do with a single predetermined command. And in the previous year, we moved to using Flakes. And this allowed us to actually pin not just channel, but commit in the Nix packages. And now we may actually push updates of the new major releases.

The problem was that when a new major NixOS release comes out, there are incompatible changes in the configuration that must be addressed. And before, when the channel and configuration updates were separate, they were out of sync, and it caused problems. Now, as our configuration itself pins a NixOS version, we can update them at the same time. And nowadays, when you click update, it will just update to a new version.

Kirill

It's clearly for end user.

Inex

We hide this from the user, well, because user doesn't really need to know about this, like these technical details. We just made it so you click a button and it updates.

Ronnie

Yeah, nice. And also, the setup is also very nice, that you handle it from an app on your phone, and the rest is being done automatically.

Tessel

Can you tell us something about working on this project? What is hard about working on it?

Kirill

First of all, our technology stack is complex. NixOS, Flutter, Dart, Python, GraphQL. Inex tell me more.

Inex

Well, that's a lot of technologies. And NixOS is quite niche. It's hard to find specialists in this field. And our needs with NixOS are quite advanced. So, the hardest part here was to find people who are capable enough to actually implement our needs in the Nix language.

How to implement different features such as single sign-on and others declaratively in Nix?

How do we integrate everything? One of the most difficult tasks is also integrating everything.

We have three layers. It's the Nix layer, where we have our configuration. We have API layer, which connects the system itself with the application, which modifies the Nix inputs. And the application itself is also quite complex.

Kirill

Second, the mission is challenging. We are creating automated cloud hosting for non-technical users. And third, the other one is political. I am Russian by birth, was in Ukraine before the war. And now I am in Germany. Jetzt lerne ich Deutsch. Our team of six people is based in Georgia. It's difficult.

Tessel

Talking about that, can you tell us something as to why you started making SelfPrivacy?

Kirill

I was amazed by the high level of privacy when I first saw [DeltaChat](https://delta.chat/). DeltaChat is my crush.

Tessel

Sorry, one moment. Can you explain what is DeltaChat for people who don't know?

Kirill

Improvise. He has better English.

Inex

In a nutshell, DeltaChat is an email client, which behaves like a messenger, which also encrypts all the messages end-to-end. And it also allows group chats, and all the messages are encrypted. And it has quite a nice UX, UI.

Kirill

But the only way to achieve full privacy for DeltaChat is for both parties to use their own email servers. That was four years ago. There is still no easy way for non-technical users to set up their own mail server. SelfPrivacy does this in a few clicks and gives you unlimited email addresses for the cost of VPS. It's around 5 euros per month.

Tessel

And why do you think it is important to give non-technical users this possibility?

Kirill

They have no way to do it privately. I think only us. If you want an email server, what should you do?

Inex

Well, you might contact other people who can set up the server, but do you trust them? Is it private?

There are email server providers which will do it for you for money, but all your data is handled by them. Do you trust them?

Kirill

You likely do not trust.

Tessel

That's a very good reason.

So earlier we talked about what the hard parts are of working on this project, but can you also tell me something that you really like about it?

Kirill

Oh, we enjoy reading feedback, like "it just works", "it's magic". It's very motivating. Many people know the difficulty of setting up an email server and getting the DNS setting correct. *We just make it work.*

Tessel

That's really nice.

Ronnie

Yeah, I like the zero trust model that you use, and also, I mean, you are creating a communication channel for people that do not trust other servers, other companies, and especially not the Signal and the Telegrams of this world. One thing that I was thinking is, do you also use an encrypted file system on the server? Because it might be possible. One of the options that you offer through Hetzner, for example, is that those companies look into the server and read the files that are in there. Or am I now describing a feature request?

Kirill

Currently, users can choose Hetzner or DigitalOcean as their VPS provider. However, we plan to add [Proxmox](https://www.proxmox.com/en/) as a bare-metal server to increase independence and security. And then you can edit the encryption for the file system.

Inex

I might also add that this is a feature request that we received, and we thought about it a lot. So the problem here is, for example, if we encrypt a virtual machine on Hetzner, they might just dump the operating memory and extract the keys. So this encryption only protects the data at rest. So it actually won't protect anything, and you still have to trust the provider.

So that's why we are working on allowing you to set up SelfPrivacy on any provider or at your home. And only after that, we will add new providers to our application.

Kirill

For full privacy, you should use a dedicated server.

Ronnie

Yeah, true.

You're also working together with or making use of deSEC.io, which is also another NLNet-funded project. Why did you choose them, and how does that work out for you?

Kirill

I say, but maybe Inex repeats more correctly. Firstly, we are using Cloudflare because they have a DNS API. Nobody has it, but NGI told me about deSEC, and we are happy to use it. Inex, could you repeat correctly?

Inex

Well, quite a lot of DNS providers have DNS API.

Kirill

They are not ethical. We are not sure they don't collect information.

Inex

It is not ethical either, but we used it because it is only a DNS, so no user data actually passed through it. And it is really used because of the ease of its API.

At first, when it was SelfPrivacy was a prototype, so it was the first one that was supported, and then we added deSEC because we wanted a more private alternative, and we knew that it was also NLNet-funded. It was also the reason we chose it. And it was lucky for us that deSEC also has an API, and it works well with our application. And in the future, we are planning to add many more DNS providers, but it will take some time.

Kirill

If you have an ethical VPS provider, we will be happy.

Ronnie

Is running or having DNS inside the SelfPrivacy server, is that something that is or might be on the roadmap?

Inex

We had talks about it, and it might be possible, but it's harder to implement. And here is a chicken and egg problem. How do we stop access to the server when it is not yet created? We still need DNS records to access it because we use TLS, encrypted connections, and we need a domain for that.

Ronnie

What you might do, then, is use the initial hostname that is being set by the VPS provider.

Inex

Well, not every provider actually provides it. And the server also needs to actually learn this address somehow from itself and acquire TLS certificates for it. There are technical difficulties with this. Maybe it is possible to implement, but it is not in our priorities currently. Our current priority is to add more DNS providers and implement other features right now.

Kirill

It is not private. Upstream traffic can read.

Ronnie

They can read the DNS requests?

Kirill

Requests, yeah.

Ronnie

What is your target audience? What people do you have in mind that should be using SelfPrivacy?

Kirill

My dream is everybody use family servers for a loved one. I am not a businessman. I am a bad marketing guy. I am just technical. I see the problem and I know how to fix it with technical possibilities.

Tessel

Well, you are not entirely a bad marketing guy because I looked at your website and it is very clear. It is kind of funny, I think. And it has these really nice cartoons on it. Who made those?

Kirill

It is our designer, Nevfy. She is awesome. It is so young and so cool.

Tessel

It is presented really nice and as I said, it also really explains what SelfPrivacy does.

Kirill

We are not sure. Even IT guys don't understand what we are doing and why. I don't know why. It is because we are here.

Ronnie

Talking about business, what steps are you taking to ensure the longer-term sustainability of your projects?

Kirill

I think about it every time. This project is expensive for me. I spent a lot of money and time for it but I didn't see an ethical way to monetization. We don't want to be engaged with a service provider because it is not zero trust. We don't want to know our clients.

Maybe we can create a subscription in the marketplaces. For example, Google Play Market We tried to publish our software to the Apple Store but we were banned or something else. Nobody responded to us. But I want SelfPrivacy free always for Android users. It's very critical.

Maybe we can add a commercial project in the SelfPrivacy-like platform. For example, some data analytics. I don't know. Now we have a platform for any open-source software which allows NixOS. And I like that. If you have some business mentor I will be happy to speak with them.

Tessel

Actually, we do. The NGI Zero Coalition also offers practical support. One of those supports is organizations like Apple or CCT they offer mentor support for business models. We could definitely help you with that.

Kirill

Awesome.

Tessel

And did you think about a donation model?

Kirill

I don't believe that. I know nobody who can earn with donation. Maybe I have a lack of information. But I know one. It was... If you know [TOGAF ArchiMate](https://www.opengroup.org/archimate-forum/archimate-overview) program it's enterprise architecture software and they can live on donation.

Tessel

If I understand correctly you are basically funding this yourself, right?

Kirill

Yeah.

Tessel

You're paying people to develop it.

Kirill

Yeah, I'm paying every week. For Georgia it's fine. It's impossible to do in Europe. Europe is too expensive.

Tessel

So you have other businesses where you earn the money and then you just put it into SelfPrivacy?

Kirill

Yeah, you're right.

Tessel

That's true dedication.

Ronnie

It is, yeah. And I can also recommend doing some donation model putting a donation button on your website because I'm very sure that there are donors out there that really believe in privacy and would like to fund you.

Kirill

Okay, thank you. But I need help with it. And I'm afraid that Google banned us because Google don't like donation on the site.

Inex

Google doesn't like it when you put links or use payments outside of the Google system. So we might add it to the Android flavor donation button. But speaking with Google Play, maybe it will be easier just to make an application paid in the Google Play and free in the F-droid like, for example, OsmAnd does.

Ronnie

Yeah. What are the next steps for SelfPrivacy?

Kirill

At the moment, SelfPrivacy offers services such as email, video meetings, password management and file server. We are planning to add more communication and collaboration services in particular Fediverse services such as [PeerTube](https://joinpeertube.org/), [Mastodon](https://joinmastodon.org/) and [Castopod](https://castopod.org/).

Ronnie

What I really like about that list of projects is that you are choosing truly open-source projects. Yeah, that's an amazing list.

Inex

I might say that *we add services that we use ourselves* because we all are self-hosters with a large experience. Me, for example, I self-host for years already and I know all the pain of setting everything up on different systems how it is actually not always easy to maintain everything.

It might be easy to set up something but maintaining is a chore and sometimes it is not a chore you actually want to do. But you have to, because, for example, there are security advisories, there are updates that you have to apply, you run out of space, something is down, you have to up this and sometimes it's just sad seeing all of this.

Ronnie

What can the listeners of our podcast do to help you to bring your project further?

Kirill

Just install SelfPrivacy, communicate with your loved ones via DeltaChat, and escape big tech surveillance. Send me a nice message on DeltaChat if you want. When I want to speak with someone I want to send an email to the private server. I have a private server. I want everyone to have a private server.

Tessel

That's really nice. Can you tell us something about how NGI Zero helped your project?

Kirill

NGI Zero has been a lot of help. First of all, *it's confirmation that we are doing the right thing*. When I look at other projects that NGI has supported, I feel that there is still hope for privacy on the Internet.

Tessel

Can you give advice to people who are also considering to apply for NGI Zero?

Kirill

Be brave. Apply and don't be afraid to discuss your ideas. Your idea could be a breakthrough. It could change everything for the better. Unfortunately, many IT professionals are too shy.

Tessel

That's beautiful advice. To go back to the start of this conversation we asked you both what are the issues today with the Internet. You are giving a slice of the solution by creating and maintaining SelfPrivacy. Do you see any other initiatives or trends that are contributing to improving the Internet a bit?

Kirill

Maybe I'm too pessimistic. So far, all I can see is that privacy is getting worse. I've also heard that NGI might have funding problems but I hope for the best and we will continue to develop SelfPrivacy as much as I can.

Tessel

If we are to solve the problems of privacy on the Internet what should be done? What would be the fundamental steps that would improve it?

Kirill

Inex?

Inex

My first thought is that it's educating people about privacy, about their data, about how the data is processed, what can be done with it. Because *Big Tech did a great job at educating people of their own paradigm*. It is hard for people to move to actually private services. Federated protocols are very confusing for ordinary people. We see a lot of problems people have, things like choosing a server, what server do I have to choose? What is a server anyway? And a lot of people... I'm not sure about places like Germany. I heard that in Germany people really like privacy. But in other places it is a common thing to hear, like "I don't have anything to hide!" It's hard to actually change this mind usually, from the people.

Kirill

NGI has supported a lot of great independent initiatives. The best thing you can do is keep doing this for the long term and make the Internet healthier.

Tessel

Yeah, I think that's a good combination of solutions. On the one hand to educate the end users and on the other hand make the Internet actually better so that they have something to choose from. It's really good advice. Thank you. Do you have any more questions, Ronny?

Ronnie

No, I think this was a wonderful conversation about a very interesting project.

Kirill

Thank you. I can end it. There would be no room for conflict if the world could exchange ideas without being watched. People can all agree on anything when there is no asymmetry of access to information.

Tessel

That's beautiful. That's a beautiful way to work towards. Well, thank you Kirill and Inex very much for this great conversation and even more for the SelfPrivacy project that you are working on because it's really contributing to a better Internet for all. Thank you very much.

Kirill

Thank you.

Inex

Thank you.

Ronnie

Большое спасибо!


The European Union must keep funding free software

This is open letter urging the European Commission to continue funding the NGI programmes that support free software in Europe, emphasizing their importance for technological sovereignty and innovation.

The SelfPrivacy project was granted NGI funding via NLnet. Other FOSS related projects also benefit from NGI funding. This funding is now at risk for future projects.

Initially publishead by petites singularités. English translation provided by OW2.


Open Letter to the European Commission.

Since 2020, Next Generation Internet (NGI) programmes, part of European Commission’s Horizon programme, fund free software in Europe using a cascade funding mechanism (see for example NLnet’s calls). This year, according to the Horizon Europe working draft detailing funding programmes for 2025, we notice that Next Generation Internet is not mentioned any more as part of Cluster 4.

NGI programmes have shown their strength and importance to supporting the European software infrastructure, as a generic funding instrument to fund digital commons and ensure their long-term sustainability. We find this transformation incomprehensible, moreover when NGI has proven efficient and economical to support free software as a whole, from the smallest to the most established initiatives. This ecosystem diversity backs the strength of European technological innovation, and maintaining the NGI initiative to provide structural support to software projects at the heart of worldwide innovation is key to enforce the sovereignty of a European infrastructure. Contrary to common perception, technical innovations often originate from European rather than North American programming communities, and are mostly initiated by small-scaled organizations.

Previous Cluster 4 allocated 27 million euros to:

  • “Human centric Internet aligned with values and principles commonly shared in Europe” ;
  • “A flourishing internet, based on common building blocks created within NGI, that enables better control of our digital life” ;
  • “A structured ecosystem of talented contributors driving the creation of new internet commons and the evolution of existing internet commons”.

In the name of these challenges, more than 500 projects received NGI funding in the first 5 years, backed by 18 organisations managing these European funding consortia.

NGI contributes to a vast ecosystem, as most of its budget is allocated to fund third parties by the means of open calls, to structure commons that cover the whole Internet scope - from hardware to application, operating systems, digital identities or data traffic supervision. This third-party funding is not renewed in the current program, leaving many projects short on resources for research and innovation in Europe.

Moreover, NGI allows exchanges and collaborations across all the Euro zone countries as well as “widening countries” 1, currently both a success and an ongoing progress, likewise the Erasmus programme before us. NGI also contributes to opening and supporting longer relationships than strict project funding does. It encourages implementing projects funded as pilots, backing collaboration, identification and reuse of common elements across projects, interoperability in identification systems and beyond, and setting up development models that mix diverse scales and types of European funding schemes.

While the USA, China or Russia deploy huge public and private resources to develop software and infrastructure that massively capture private consumer data, the EU can’t afford this renunciation. Free and open source software, as supported by NGI since 2020, is by design the opposite of potential vectors for foreign interference. It lets us keep our data local and favors a community-wide economy and know-how, while allowing an international collaboration. This is all the more essential in the current geopolitical context: the challenge of technological sovereignty is central, and free software allows addressing it while acting for peace and sovereignty in the digital world as a whole.


*1 As defined by Horizon Europe, widening Member States are Bulgaria, Croatia, Cyprus, the Czech Republic, Estonia, Greece, Hungary, Latvia, Lituania, Malta, Poland, Portugal, Romania, Slovakia and Slovenia. Widening associated countries (under condition of an association agreement) include Albania, Armenia, Bosnia, Feroe Islands, Georgia, Kosovo, Moldavia, Montenegro, Morocco, North Macedonia, Serbia, Tunisia, Turkey and Ukraine. Widening overseas regions are : Guadeloupe, French Guyana, Martinique, Reunion Island, Mayotte, Saint-Martin, The Azores, Madeira, the Canary Islands.