Skip to content

Latest commit

 

History

46 Commits

Folders and files

Repository files navigation

aSocial

Join the chat at https://gitter.im/state-of-the-art/aSocial

Open source private distributed social network application with focus on security, control and local store of social information.

Important rant

Let's face it: the Internet is broken.

You know the drill by now. Internet feels like something from the stone age - drowned in spam, junk folders, and those endless "prove you're human" loops that waste your time. Every website bombards you with cookie pop-ups, invisible tracking scripts that follow you everywhere, and ads that somehow know what you searched for last week. Passwords? They're not enough anymore. Now you have to hand over your email, phone number, ssn, address for 2FA just to log in somewhere and wait for this SMS to get through, turning your personal info into another piece of data they own.

But it goes deeper than that.

Your photos, chats, family memories, and even your private thoughts sit on some giant company's servers. They can sell that data, leak it in a hack (which become so common so no-one cares), or change the rules overnight and lock you out of your own account (hello automod and AI with no ability to sympathize you). One wrong post/comment (or no post at all) and suddenly your friends can't see you, your group chats disappear, or your profile gets shadow-banned for reasons they never explain. It's not just annoying; it's your life they're controlling.

And now governments are jumping in too. Laws are piling up that force apps and websites to hand over your private messages, decide what kind of content is "allowed", or even block entire services if they don't comply. What you can say, who you can talk to, and what you're allowed to see is increasingly decided by someone else - not by you and the people you actually care about. It feels less like a free space to connect and more like a monitored public square where the rules keep changing.

On top of all that, the whole thing is designed to waste your time. Endless ads and spam don't just annoy you - they literally steal your attention, the most valuable thing you have. Every scroll, every notification, every "recommended for you" is built to keep you hooked while someone else profits.

We didn't sign up for this constant surveillance, censorship, data leaks, and corporate (or government) control. We just wanted a simple way to stay in touch with the people who matter.

That's exactly why we building aSocial - a social network that actually puts you back in charge.

Imagine this instead:

  • Your stuff stays yours. Photos, messages, memories - they live only on your own rules and shared controllably. No company vault holding everything hostage.
  • You talk directly to friends. It's private, secure, peer-to-peer - like a locked room where only the people you invite can enter. No middleman reading along.
  • Spam and ads are basically gone. A tiny, one-time payment directly to receiver (the digital equivalent of a postage stamp) stops bots and junk cold. Real people get through easily; the noise doesn't.
  • No more spying or selling your data. You decide exactly who sees what, and you can change your mind anytime. No trackers, no leaks, no surprises.
  • No one can censor or shut you down. Because there's no single company or government in the middle, your connections can't be easily blocked or deleted.

aSocial is about getting back the simple joy of connecting with the people you love - on your terms, without the endless hassle, spying, or someone else deciding what's okay to share.

I'm doing this because I believe we all deserve better than the broken, exhausting internet we have today. We deserve a place that respects our time, our privacy, and our freedom to talk to each other without interference.

If any of this sounds familiar, if you're tired of the same old frustrations too - we'd love for you to be part of it.

About

The general purpose of the aSocial is to replace all the centralized social networks & messengers and allow the users to never store their information ini just one place. aSocial was born from the idea of complete control over social information, liberated from spam/ad, simplify connection between people and fight censorship. Storing the information on the user's devices, using strong cryptography with an ability of plausible deniability, integration the Bitcoin network will allow us to solve the issues we see everyday in the huge centralized social providers.

History

  • 12/28/2013 - The project was started as typical social
  • 10/17/2014 - Mutated into distributed one and found itself. The POC was focused on UI, but some basic components were also prepared.
  • 03/30/2016 - Stopped due to breaking Qt changes, not ready Lightning network (second layer of Bitcoin for microtransactions) and overall project complexity impossible to drag by one person.
  • 01/31/2021 - The lessons have been learned and rerun the aSocial development was started with SDD and searching for people who can understand & help with thinking and development. Unfortunately noone reached out and the project was stopped again.
  • 01/01/2026 - AI assistants raise and a year of successfull usage gave an idea of resurrecting the project development.

Usage

WARNING: By using this software you agree not to limit forcefully the other's freedom of ditributing any kind of information even if you don't like it's nature. In case you can't comply - please remove aSocial from your device as fast as possible.

Please check out the wiki page: Wiki

Requirements

TODO

Application

The application itself is native divided into 2 parts - background backend and UI frontend. Backend working with a simple key-value database for relay/background tasks, frontend working with an encrypted key-value store to process profile data through the VFS → DBKV-rocksdb plugin chain (encrypted container → protobuf KV store).

Storage Architecture

Profile data is stored inside an encrypted VFS container (data.vfs):

  1. vfs-cake creates a Shufflecake-inspired container filled with random bytes.
  2. Each passphrase derives a unique key that reveals a separate set of virtual files (plausible deniability).
  3. dbkv-rocksdb opens a virtual .dat file as a temporary RocksDB instance (via DBKVPluginInterface::openDatabase() → DBKVDatabasePluginInterface). All entity data is serialised with protobuf wire format and stored under a hierarchical key scheme for efficient prefix scans (e.g. c/<persona>/<contact> for contacts).
  4. Data schema is defined in proto/asocial/v1/*.proto; C++ types are generated at build time by qt_add_protobuf into the shared asocial_proto library.
  5. All DBKV CRUD operations run on a DBKVDatabasePluginInterface session handle and use QProtobufMessage for serialisation/deserialisation.
  6. CoreInterface and all plugins exchange data as protobuf-generated types (asocial::v1::*) directly - no QVariantMap conversion. Factory methods (db::create*) return unsaved objects; store* persists them.
  7. KV key helpers, validation functions, factory methods and the plugin permission enum are auto-generated by protoc-gen-coredb from proto annotations (entity_config / deps_config) using the asocial_tpl Jinja2-like template engine.

Media (Storage plugins + Media layer)

Media files (photos, videos, audio, documents) are handled by the Core media layer on top of pluggable Storage blob stores (StoragePluginInterface → StorageStorePluginInterface):

  • storage-fs keeps content-addressed blobs (hex BLAKE2b-256) as plain files under <workdir>/media/ — fast, streamable and visible to other applications.
  • storage-vfs keeps blobs as extra virtual files inside the open profile data.vfs — fully encrypted, for sensitive media (media import <path> vfs).
  • MediaCodec plugins (MediaCodecPluginInterface, first one media-codec-qt) probe formats and render thumbnails; new formats (RAW, ffmpeg video, ...) are added by dropping in a plugin.
  • Import deduplicates by content id, detects kind/MIME/dimensions, creates the File entity and a thumbnail child File (parent_uid). File.url is a storage URI (fs:<id> / vfs:<id>).
  • Watch folders: user-selected directories (e.g. the camera folder) are watched; new files land in a sorting inbox (MediaInboxItem) where the user assigns owner persona, tags, description.
  • Person marks: MediaAnnotation stores points/rectangles (normalized 0..1 coordinates, with an optional time range and keyframe path for videos) referencing Personas/Contacts.
  • Multi-device sync: media travels as sealed PackageItems over the Router (MEDIA_MANIFEST with inline thumbnail, MEDIA_REQUEST / MEDIA_CHUNK / MEDIA_HAVE for chunked pull/push). Device.tag_policies decide per tag what each device keeps ("full" / "cache" / "thumb" / "none") — a media-server device archives everything, a phone keeps thumbnails and fetches originals on demand.
  • Container metadata: DB stays the canonical truth; tags/description/person regions can be mirrored as XMP (mwg-rs regions) — sidecar next to stored blobs, embedded on JPEG export (libs/media_meta).

Communication (Router layer)

All communication is handled by a background Router - part of the base application (not a plugin), running on its own thread (desktop) or a foreground service (Android). It starts as soon as aSocial runs, before any profile is opened.

  • The Router keeps its own encrypted state in a separate router.vfs container. An empty router password lets it auto-start without user interaction (identity more exposed); a configured password keeps its identity in a hidden layer.
  • The Router owns pluggable Comm carriers (CommPluginInterface) that move opaque Packages over any medium. The first carrier is comm-mesh - an anonymous, single-point-of-failure-free mesh with TTL-limited flooding, message de-duplication, per-hop Ed25519 signatures and per-neighbour reputation (a General Mesh; see AGENTS.md and tmp/comm_invite_messages_poc).
  • Privacy boundary: the Profile layer does all the cryptography and hands the Router only a fully-sealed, opaque Package. Payload kind (handshake / message / ack) lives inside the encrypted PackagePayload — never as a cleartext Package field. Multiple items may share one Package (e.g. HANDSHAKE+MESSAGE on first contact). The only on-wire routing hint is a 4-byte tag
    • a malicious relay can not learn the message source, destination, or payload type.
  • A future carrier can attach a one-way Bitcoin/Lightning payment to a message so a recipient can charge unknown senders (see tmp/comm_public_payment_poc).

GUI (ui-gui)

The default graphical interface is built with Qt Quick and designed for both desktop and Android (touch-ready). Features include:

  • Persona connection graph – central persona surrounded by contacts with trust-level-weighted connection lines and group-coloured rings
  • Family tree – parents, siblings and extended family below the persona
  • Interactive timeline – zoomable event bar at the bottom of the screen
  • Radial context menu – right-click / long-press for context actions
  • Hamburger menu – profile management, persona switching, settings
  • Media library – thumbnail grid with import picker, watched-folder inbox sorting, image viewer with person marks, avatar attachment for personas
  • Day/night background – animated sky that changes with wall-clock time
  • Markdown messages – compose and view messages with rich formatting

Core features

Basic features of the social platform:

  • Plugins - add or remove components or use the other vendor component as a plugin
  • History - store not just dates of item, but also any edit of the items
  • Persons - personal & legal entities, existing (with profiles) or imaginary
  • Events - anything happened, happening, going to happen in the life
  • Messages - monetized conversation threads or any other interaction like profile updates, news
  • Overlays - your vision or additional information for existing or new entities, could be password protected
  • Synchronization - make sure your devices replicates the information / profiles you have
  • Sharing - ability to share your files with friends from any device you have

Additional features

Based on core features aSocial support the embedded and external additional features:

  • Tree of life - usual thing, your relatives and relations
  • Testament - special message, will be triggered to send on some condition
  • Contracts - special message, signed by 2 parties, could have penalties, money and end dates
  • Web-version - access to web interface from web browser

Plans

You can see all the feature requests/bugs on the github page:

OpenSource

This is an experimental project - the main goal is to test State Of The Art philosophy on practice.

We would like to see a number of independent developers working on the same project issues for the real money (attached to the ticket) or just for fun. So let's see how this will work.

License

Repository and it's content is covered by GPL v3.0, so make sure you provide the sources.

If you will have some time - it will be great to see your changes merged to the original repository - but it's your choice, no pressure.

Build

Build in docker

  1. Clone the repository:
    $ git clone https://github.com/state-of-the-art/asocial.git
    
  2. Run the build script from the repository root:
    $ ./build.sh                  # Debug desktop AppImage (gcc)
    $ ./build.sh Release          # Release desktop AppImage
    $ ./build.sh android          # Debug Android APK
    $ ./build.sh Release all      # Release desktop + Android
    
  3. Locate the desktop AppImage in build/result/:
    $ ./build/result/aSocial-x86_64-Debug.AppImage --help
    main: Init v0.1.0
    Usage: ./aSocial-x86_64.AppImage [options]
    
    Options:
      -h, --help     Displays help on commandline options.
      --help-all     Displays help, including generic Qt options.
      -v, --version  Displays version information.
      --no-gui       Load CMD instead of GUI in case GUI is available
    

Build for Android

The GUI build for Android (arm64-v8a) uses the same script with the android platform:

$ ./build.sh android           # Debug (default flavor)
$ ./build.sh Release android   # Release

This builds the asocial:build-android image (Qt 6.10 Android + a host toolchain used for the build-time code generators) and emits an installable aSocial.apk in build/result/.

A few things are different from the desktop build and are worth knowing:

  • The protoc-gen-* code generators are compiled for the build host (they run during the build), while everything else is cross-compiled for the device — see tools.cmake and each component's tools/ directory.
  • Each lib/plugin declares supported platforms in manifest.cmake. By default the Android build includes ui-gui, dbkv-rocksdb, and vfs-cake; the desktop console (ui-console) lists gcc only. Pass -DASOCIAL_BUILD_ALL_PLATFORMS=ON to attempt all components on every platform.
  • The aSocial plugins are bundled into the single .apk (via QT_ANDROID_EXTRA_LIBS) and loaded at runtime from the app's native library directory, since Android has no <appdir>/plugins layout. The QtCreator Android kit can be used to deploy/run/debug on a device or emulator; set -DASOCIAL_PLATFORM=android on the kit (inferred automatically when ANDROID is set).

Test

Integration tests use the Kotik helper (tests/kotik/) which wraps the full AppImage lifecycle: it creates an isolated temp directory, launches the app with -w, monitors stdout/stderr, and provides assertion helpers for Qt Test.

$ ./test.sh

Privacy policy

The whole purpose of this project - is to make sure your personal information will be controlled by you, there is no way the aSocial (except for external plugins, please see their privacy policy) will share your information without your permission with someone. But please be careful - once shared information will stay on the Internet forever, so think twice about what you are doing.

About

Private distributed social network and messenger application

Resources

Stars

11 stars

Watchers

6 watching

Forks

Releases

Packages

Contributors

Languages