Initial commit: JustAMessenger v0.1.0

Серверная часть (Go):
- WebSocket сервер с бинарным протоколом
- XChaCha20-Poly1305 шифрование
- zstd сжатие с дедупликацией (64KB чанки)
- SQLite хранилище (WAL режим)
- Управление гильдиями, каналами, ролями
- Федерация между серверами (ed25519)
- REST API + WebSocket endpoints

Клиентская часть (Flutter):
- Material Design 3 тёмная тема (Discord-like)
- WebSocket соединение с сервером
- Экраны: сплэш, логин, домашний, гильдии, чат
- Модели: пользователи, гильдии, каналы, сообщения, роли
- Сервисы: соединение, API, криптография, тема
- Виджеты: иконки гильдий, сообщения, ввод чата
- Web сборка (PWA)

Документация:
- AGENTS.md — контекст для ИИ ассистентов
- docs/protocol.md — спецификация протокола
This commit is contained in:
SashegDev
2026-06-06 22:39:14 +00:00
commit 096c4d0a2d
40 changed files with 5054 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<title>JustAMessenger</title>
<link rel="manifest" href="manifest.json">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: #313338; color: #F2F3F5; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; overflow: hidden; }
#loading {
display: flex; flex-direction: column; align-items: center; justify-content: center;
height: 100vh; width: 100vw;
}
.jam-logo {
width: 80px; height: 80px; background: #5865F2; border-radius: 20px;
display: flex; align-items: center; justify-content: center;
font-size: 32px; font-weight: 800; color: white; letter-spacing: 2px;
box-shadow: 0 0 40px rgba(88, 101, 242, 0.4);
margin-bottom: 24px;
}
.spinner {
width: 32px; height: 32px; border: 3px solid #3F4147;
border-top-color: #5865F2; border-radius: 50%;
animation: spin 0.8s linear infinite; margin-top: 16px;
}
@keyframes spin { to { transform: rotate(360deg); } }
.subtitle { color: #80848E; font-size: 14px; margin-top: 8px; }
.version { color: #5865F2; font-size: 12px; margin-top: 24px; }
flutter-view { height: 100vh; width: 100vw; }
</style>
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/flutter_service_worker.js');
});
}
</script>
</head>
<body>
<div id="loading">
<div class="jam-logo">JAM</div>
<div class="spinner"></div>
<div class="subtitle">JustAMessenger</div>
<div class="version">v0.1.0</div>
</div>
<script src="flutter.js" defer></script>
<script>
window.addEventListener('load', function() {
const loading = document.getElementById('loading');
_flutter.loader.loadEntryPoint({
onEntryPointLoaded: function(engineInitializer) {
loading.style.display = 'none';
engineInitializer.initializeEngine().then(function(appRunner) {
appRunner.runApp();
});
}
});
});
</script>
</body>
</html>