Kaiteki Alpha

The comfy SNS client for everything, everywhere.

download Download

Screenshot of the main screen

Why Kaiteki?

Big heart surrounded by icons of operating systems, social media sites, accessibility and the globe.

One client for everyone, everything, and everywhere

Kaiteki has support for 4 platforms, 4*services and over 10 languages.

No matter who you are, Kaiteki is the right client for you.

* Mastodon, Pleroma, Misskey and Twitter. More services are indirectly supported by shared APIs. See the backend support board for more details.

Image showing Kaiteki's interface in a blueprint style

Delightful user interface

Kaiteki ships a beautiful theme that's clean, accessible and soft.

It uses the Material Design guidelines to provide a consistent and intuitive experience.

import "dart:async";

import "package:flutter/material.dart";
import "package:hive_flutter/hive_flutter.dart";
import "package:kaiteki/account_manager.dart";
import "package:kaiteki/app.dart";
import "package:kaiteki/di.dart";
import "package:kaiteki/model/auth/account_key.dart";
import "package:kaiteki/model/auth/secret.dart";
import "package:kaiteki/repositories/hive_repository.dart";
import "package:kaiteki/theming/default/themes.dart";
import "package:kaiteki/ui/shared/crash_screen.dart";
import "package:shared_preferences/shared_preferences.dart";

/// Main entrypoint.
Future<void> main() async {
  final Widget app;

  try {
    WidgetsFlutterBinding.ensureInitialized();

    // initialize hive & account manager
    await initializeHive();
    final accountManager = await getAccountManager();

    // Initialize shared preferences
    final sharedPrefs = await SharedPreferences.getInstance();

    // construct app & run
    app = ProviderScope(
      overrides: [
        sharedPreferencesProvider.overrideWith((_) => sharedPrefs),
        accountManagerProvider.overrideWith((_) => accountManager),
      ],
      child: const KaitekiApp(),
    );
  } catch (e, s) {
    handleFatalError(e, s);
    return;
  }

  runApp(app);
}

void handleFatalError(Object error, StackTrace stackTrace) {
  final crashScreen = MaterialApp(
    theme: getDefaultTheme(Brightness.light, true),
    darkTheme: getDefaultTheme(Brightness.dark, true),
    home: CrashScreen(
      exception: error,
      stackTrace: stackTrace,
    ),
  );
  runApp(crashScreen);
}

Future<void> initializeHive() async {
  await Hive.initFlutter();
  Hive
    ..registerAdapter(AccountKeyAdapter())
    ..registerAdapter(ClientSecretAdapter())
    ..registerAdapter(AccountSecretAdapter());
}

/// Initializes the account manager.
Future<AccountManager> getAccountManager() async {
  AccountKey fromHive(dynamic k) => AccountKey.fromUri(k as String);
  String toHive(AccountKey k) => k.toUri().toString();

  final accountBox = await Hive.openBox<AccountSecret>("accountSecrets");
  final accountRepository = HiveRepository<AccountSecret, AccountKey>(
    accountBox,
    fromHive,
    toHive,
    true,
  );

  final clientBox = await Hive.openBox<ClientSecret>("clientSecrets");
  final clientRepository = HiveRepository<ClientSecret, AccountKey>(
    clientBox,
    fromHive,
    toHive,
    true,
  );

  final manager = AccountManager(accountRepository, clientRepository);
  await manager.loadAllAccounts();
  return manager;
}

Built independently from the ground up and open source from the very beginning

100% free and open source — Kaiteki is not backed by anyone but the developers making it.

Peek inside


We need your help!

Anyone from application design experience to translators are needed.

Check out the contribution page for find out on how you can help.