souchastnik/index.html
2026-09-03 23:42:20 +03:00

207 lines
9.7 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Соучастник — клавиатура, которая называет статью</title>
<meta name="description" content="Android-клавиатура, которая показывает, какой срок вы получите за то, что пишете в интернете. ИИ-модель работает целиком на устройстве, разрешения на интернет у приложения нет.">
<meta name="color-scheme" content="light dark">
<meta property="og:title" content="Соучастник">
<meta property="og:description" content="Помогает разобраться, какой срок вы получите за то, что пишете в интернете. Всё считается на устройстве, интернета у приложения нет.">
<meta property="og:type" content="website">
<style>
:root {
--red: #C0392B;
--bg: #F7F7F8;
--ink: #17171A;
--muted: #6E6E74;
--rule: #E2E2E5;
--card: #FFFFFF;
--strip-bg: #17171A;
--strip-admin: #D8A200;
--key: #2B2B2E;
--key-ink: #F2F2F2;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #17171A;
--ink: #F2F2F2;
--muted: #8A8A90;
--rule: #2E2E33;
--card: #1E1E22;
}
}
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
margin: 0;
background: var(--bg);
color: var(--ink);
font: 16px/1.6 system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
padding: 0 20px 72px;
}
main { max-width: 46rem; margin: 0 auto; }
a { color: var(--red); }
code, pre {
font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", monospace;
font-size: 0.875em;
}
code {
background: var(--card); border: 1px solid var(--rule);
border-radius: 4px; padding: 0.1em 0.35em;
}
pre {
background: var(--card); border: 1px solid var(--rule); border-radius: 8px;
padding: 14px 16px; overflow-x: auto; line-height: 1.5;
}
pre code { background: none; border: 0; padding: 0; }
/* шапка */
header { padding: 64px 0 8px; }
.lockup { display: flex; align-items: center; gap: 16px; }
.lockup svg { width: 56px; height: 52px; flex: none; }
h1 { font-size: 2rem; letter-spacing: -0.02em; margin: 0; font-weight: 650; }
.tagline { font-size: 1.25rem; line-height: 1.45; margin: 24px 0 0; max-width: 32rem; }
.disclaimer { color: var(--muted); font-size: 0.9375rem; margin: 16px 0 0; }
/* скачать */
.get { margin: 0; display: flex; align-items: center; gap: 20px; flex-wrap: wrap; }
.btn {
display: inline-block; background: var(--red); color: #fff; text-decoration: none;
font-weight: 600; font-size: 1.0625rem; padding: 13px 26px; border-radius: 8px;
}
.btn:hover { background: #A93226; }
.get dl { margin: 0; font-size: 0.875rem; color: var(--muted); }
.get dl div { display: flex; gap: 6px; }
.get dt::after { content: ":"; }
.get dd { margin: 0; color: var(--ink); }
/* демо */
figure.demo { margin: 36px 0 0; }
.phone {
max-width: 22rem; background: var(--strip-bg); border-radius: 14px;
overflow: hidden; border: 1px solid var(--rule);
}
.field { padding: 18px 14px 22px; color: #F2F2F2; font-size: 0.9375rem; background: #202024; }
.field .caret { border-left: 2px solid var(--strip-admin); margin-left: 1px; }
.strip {
display: flex; align-items: center; gap: 10px;
padding: 7px 10px; background: var(--strip-bg);
border-top: 1px solid #26262B; border-bottom: 1px solid #26262B;
}
.strip .verdict {
flex: 1; font-size: 0.8125rem; color: var(--strip-admin);
white-space: nowrap; overflow: hidden;
}
.strip .toggle { color: var(--strip-admin); font-size: 1rem; }
.keys { padding: 6px 4px 10px; display: grid; gap: 5px; }
.keys .row { display: grid; grid-auto-flow: column; gap: 4px; justify-content: center; }
.keys .row.mid { padding: 0 14px; }
.keys .row.low { padding: 0 28px; }
.keys span {
background: var(--key); color: var(--key-ink); border-radius: 4px;
text-align: center; padding: 7px 0; font-size: 0.75rem; min-width: 1.55rem;
}
figcaption { color: var(--muted); font-size: 0.8125rem; margin-top: 12px; max-width: 30rem; }
/* текст */
section { margin: 56px 0 0; }
h2 { font-size: 1.3125rem; margin: 0 0 14px; letter-spacing: -0.01em; }
p { margin: 0 0 14px; }
.note { color: var(--muted); font-size: 0.9375rem; }
.table-wrap { overflow-x: auto; }
table { border-collapse: collapse; width: 100%; font-size: 0.9375rem; }
th, td {
text-align: left; vertical-align: top;
padding: 12px 16px 12px 0; border-bottom: 1px solid var(--rule);
}
th { white-space: nowrap; width: 9rem; font-weight: 600; }
blockquote {
margin: 24px 0 0; padding-left: 16px;
border-left: 2px solid var(--rule); color: var(--muted);
}
footer {
margin: 72px 0 0; padding-top: 24px; border-top: 1px solid var(--rule);
color: var(--muted); font-size: 0.875rem;
}
footer p { margin: 0 0 8px; }
</style>
</head>
<body>
<main>
<header>
<div class="lockup">
<svg viewBox="28 30 52 48" role="img" aria-label="Соучастник">
<path d="M37,32 H61 A7,7 0 0 1 68,39 V59 A7,7 0 0 1 61,66 H37 A7,7 0 0 1 30,59 V39 A7,7 0 0 1 37,32 Z" fill="#C0392B"/>
<path d="M47,42 H71 A7,7 0 0 1 78,49 V69 A7,7 0 0 1 71,76 H47 A7,7 0 0 1 40,69 V49 A7,7 0 0 1 47,42 Z" fill="#2B2B2E" stroke="#3B3B40" stroke-width="1"/>
<path d="M59.10 68.03L59.10 68.03Q57.21 68.03 56.11 67.31Q55.01 66.60 54.57 65.33Q54.13 64.06 54.13 62.38L54.13 62.38L54.13 56.27Q54.13 54.50 54.57 53.23Q55.01 51.96 56.11 51.27Q57.21 50.57 59.10 50.57L59.10 50.57Q60.93 50.57 61.97 51.18Q63.01 51.79 63.44 52.91Q63.87 54.02 63.87 55.49L63.87 55.49L63.87 56.92L60.51 56.92L60.51 55.32Q60.51 54.73 60.45 54.22Q60.39 53.70 60.10 53.38Q59.82 53.05 59.13 53.05L59.13 53.05Q58.43 53.05 58.12 53.39Q57.80 53.72 57.72 54.26Q57.63 54.80 57.63 55.45L57.63 55.45L57.63 63.17Q57.63 63.89 57.75 64.42Q57.87 64.96 58.19 65.24Q58.52 65.53 59.13 65.53L59.13 65.53Q59.80 65.53 60.08 65.20Q60.36 64.88 60.44 64.33Q60.51 63.78 60.51 63.17L60.51 63.17L60.51 61.52L63.87 61.52L63.87 62.92Q63.87 64.41 63.45 65.56Q63.03 66.70 62.00 67.36Q60.97 68.03 59.10 68.03Z" fill="#F2F2F2"/>
</svg>
<h1>Соучастник</h1>
</div>
<p class="tagline">Клавиатура для Android. Показывает, какой срок вы получите за то, что пишете.</p>
<p class="disclaimer">Это не юридическая консультация. Настоящий суд смешнее. AI can make mistakes.</p>
</header>
<figure class="demo">
<div class="phone" aria-hidden="true">
<div class="field">да ты дурак совсем<span class="caret">&nbsp;</span></div>
<div class="strip">
<span class="verdict">ст. 5.61 КоАП · оскорбление · 3–5 тыс ₽</span>
<span class="toggle">◉</span>
</div>
<div class="keys">
<div class="row"><span>й</span><span>ц</span><span>у</span><span>к</span><span>е</span><span>н</span><span>г</span><span>ш</span><span>щ</span><span>з</span><span>х</span></div>
<div class="row mid"><span>ф</span><span>ы</span><span>в</span><span>а</span><span>п</span><span>р</span><span>о</span><span>л</span><span>д</span><span>ж</span></div>
<div class="row low"><span>я</span><span>ч</span><span>с</span><span>м</span><span>и</span><span>т</span><span>ь</span><span>б</span><span>ю</span></div>
</div>
</div>
<figcaption>Тумблер справа выключает разбор.</figcaption>
</figure>
<section id="privacy">
<h2>Приватность</h2>
<p><strong>Разрешения <code>INTERNET</code> нет.</strong> Приложение не может отправить наружу ни байта. Модель работает на устройстве, поля с паролями не разбираются.</p>
<p class="note">Проверьте сами, список разрешений должен быть пустым:</p>
<pre><code>aapt dump permissions souchastnik-1.0-arm64-v8a.apk</code></pre>
</section>
<section id="get">
<div class="get">
<a class="btn" href="https://github.com/MShverdiakov/souchastnik/releases/latest">Скачать APK</a>
<dl>
<div><dt>Размер</dt><dd>473 МБ</dd></div>
<div><dt>Требования</dt><dd>Android 9+, arm64</dd></div>
<div><dt>Версия</dt><dd>1.0</dd></div>
</dl>
</div>
</section>
<section id="how">
<h2>Как это работает</h2>
<div class="table-wrap">
<table>
<tbody>
<tr><th>Модель</th><td>Qwen3.5-0.8B, квантованная, на llama.cpp</td></tr>
<tr><th>Кандидаты</th><td>словарь триггеров сужает список статей, модель решает, есть ли состав</td></tr>
<tr><th>Скорость</th><td>4–6 с на фразу; без dotprod (Cortex-A53/A73) 15–20 с</td></tr>
<tr><th>Память</th><td>хватает 4 ГБ RAM</td></tr>
</tbody>
</table>
</div>
</section>
<section id="limits">
<h2>Границы</h2>
<p>Приложение констатирует, а не помогает обойти. Выдуманных статей нет: за VPN и Telegram не сажают.</p>
<p>Словаря триггеров в репозитории нет: за него могут посадить меня. Могу выдать по запросу.</p>
<blockquote>за идею спасибо ув. Кибердед и ув. Лука Ебков</blockquote>
</section>
<footer>
<p>GPL-3.0. Делайте что хотите. <a href="https://github.com/MShverdiakov/souchastnik">Исходный код</a></p>
</footer>
</main>
</body>
</html>