Sepet
Alışveriş listeni yaz, marketlerdeki en uygun fiyatları karşılaştır ve en ucuz sepeti saniyeler içinde oluştur.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Kindle-style reader with in-context Claude explanations plus a dedicated web space for book lovers in Ukraine.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Читалка книжок у стилі Kindle, яка пояснює виділений текст за допомогою Claude прямо під час читання.
Виділяєш слово, фразу чи абзац, натискаєш «Пояснити», і пояснення з'являється саме в контексті цієї книжки. Модель бачить виділений фрагмент, кілька абзаців до і після, назву книжки й розділу.
Chytai має дві рівноправні версії з одним інтерфейсом:
app/, Expo): та сама веб-читалка в нативній оболонці, ставиться через TestFlight, оновлюється без ревʼю Apple. Як це влаштовано і як зібрати: app/README.md.Сервер server/index.js віддає інтерфейс із src/renderer/ і невеликий API, а src/renderer/web-bridge.js замінює місток Electron на HTTP-запити. Ключ Claude API лежить лише на сервері; телефон його ніколи не бачить. Бібліотека спільна для всієї родини, а позиції й налаштування в кожного свої (вхід за ім'ям і спільним паролем).
На iPhone відкрий адресу в Safari, увійди і додай на екран «Додому» (Поділитися → На Початковий екран), і далі Chytai відкривається як застосунок.
Як читати на телефоні:
state.json, файл не змінюється; «Як у файлі» повертає метадані з файлу) і видалити книжку з підтвердженням. Видалення прибирає файл для всіх разом із позиціями читання в ній.Посилання /demo (є також на сторінці входу) відкриває читалку без пароля: одна демо-книжка, без завантажень і видалень, із денним лімітом пояснень, щоб ключ Claude не можна було вичерпати. Позиції та налаштування гостя живуть лише в пам'яті сервера.
demo/. Будь-який EPUB/PDF у /data/demo на томі має пріоритет над вбудованим.GUEST_EXPLAIN_LIMIT пояснень на гостя за день (типово 15), GUEST_EXPLAIN_TOTAL на всіх гостей (типово 300); GUEST_MODE=off вимикає демо зовсім.Сторінка /admin (кнопка «Статистика» в налаштуваннях) показує, хто читає, скільки книжок у бібліотеці і скільки пояснень використано: сьогодні, за тиждень, усього, по днях і по моделях, із приблизною вартістю за тарифами API. Лічильники живуть у state.json (stats), гості на сторінку не потрапляють. День рахується за STATS_TZ (типово Europe/Kyiv).
cp .env.example .env # ANTHROPIC_API_KEY, READER_PASSWORD, READER_SECRET
npm install
npm run web # http://localhost:8080
Застосунок описано у fly.toml (книжки й позиції лежать на томі /data):
fly launch --copy-config --no-deploy # один раз
fly secrets set ANTHROPIC_API_KEY=… READER_PASSWORD=… READER_SECRET=…
fly deploy
node scripts/upload-books.mjs https://chytai.fly.dev "~/Library/Mobile Documents/com~apple~CloudDocs/Books"
Машина засинає, коли нею ніхто не користується, і прокидається на перший запит за кілька секунд.
Щоночі о 03:30 за Києвом .github/workflows/backup.yml знімає копію томів /data обох застосунків (chytai-web: база сайту; chytai: позиції, нотатки, книжки), перевіряє її, шифрує ключем age і зберігає як артефакт запуску на 90 днів. Друга копія: щоденні знімки томів у самому Fly (зберігаються 30 днів).
Приватний ключ у репозиторій не потрапляє: він лежить у ~/Projects/chytai/.backup-key на Маку Макса і в файлах проєкту (chytai-backup/backup-key.txt). Без нього копії не розшифрувати.
Відновлення (наприклад, бази сайту):
# 1. завантажити артефакт chytai-web-РРРР-ММ-ДД з GitHub Actions → Backup і розпакувати zip
age -d -i ~/Projects/chytai/.backup-key chytai-web-РРРР-ММ-ДД.tar.gz.age > backup.tar.gz
mkdir restore && tar xzf backup.tar.gz -C restore # restore/web/chytai.db
# 2. залити на том (машина має працювати) і перезапустити
fly ssh sftp shell -a chytai-web # put restore/web/chytai.db /data/web/chytai.db.new
fly ssh console -a chytai-web -C "sh -c 'cd /data/web && rm -f chytai.db-wal chytai.db-shm && mv chytai.db.new chytai.db'"
fly machine restart -a chytai-web
Або зі знімка Fly: fly volumes snapshots list <vol> і fly volumes create web_data --snapshot-id <id> -a chytai-web.
Тим самим запуском робиться копія бази сайту для тестів: справжні емейли замінено на <id читача>@test.invalid, сесії, коди входу, токени MCP і секрети з meta вирізано (scripts/test-db-scrub.py). Вона зашифрована тим самим ключем і лежить файлом у релізі test-db, щоночі новий. Узяти її в data/web/ (стара база збережеться поруч як chytai.db.bak-…):
scripts/fetch-test-db.sh
Увійти можна будь-яким читачем кодом з емейлу: без RESEND_API_KEY код пишеться в лог сервера.
Потрібен Node.js 20 або новіший (brew install node, якщо його ще немає).
npm install
npm start
Ключ Claude API можна покласти у файл .env поруч із package.json (рядок ANTHROPIC_API_KEY=sk-ant-…) або вставити в налаштуваннях (⌘,), де він шифрується через Keychain macOS. Ключ із налаштувань має пріоритет. Створити ключ можна на https://platform.claude.com, розділ API Keys.
Збірка .app:
npm run dist
Готовий .dmg з'явиться в dist/. Застосунок не підписаний, тож перший раз відкривай його через правий клік → «Відкрити».
Пояснення робить одна модель, за замовчуванням claude-opus-5-5 з effort low. У налаштуваннях можна вибрати claude-sonnet-5-5 або claude-haiku-5-5 (найдешевша). Для Opus і Sonnet увімкнено серверний fallback (fallbacks: "default"): якщо модель відмовиться відповідати на фрагмент, запит автоматично повториться на іншій моделі.
EPUB і PDF відкриваються напряму. У PDF текст виділяється так само, а як контекст береться текст поточної сторінки й сусідніх. Скановані PDF без текстового шару пояснювати не вийде, бо там немає тексту для виділення. У десктопній версії MOBI, AZW, AZW3, FB2, DOCX, RTF, TXT та інші читалка сама конвертує в EPUB через Calibre, якщо він встановлений (brew install --cask calibre або calibre-ebook.com). Конвертована копія кешується, тож вдруге книжка відкривається одразу.
Книжки, куплені в Kindle Store, зазвичай захищені DRM. Calibre такі файли не конвертує, і читалка покаже про це повідомлення. Книжки без DRM (наприклад, з Gutenberg чи Standard Ebooks, або ті, де видавець вимкнув DRM) працюють.
server/index.js — веб-сервер: вхід, бібліотека, позиції й налаштування кожного читача, запити до Claude.src/renderer/web-bridge.js — місток веб-версії замість Electron.src/renderer/ — спільний інтерфейс: renderer.js (читалка на epub.js і панель пояснень), context.js (вибирає текст навколо виділення), library-view.js (бібліотека), pdf-view.js і pdf-reflow.js (PDF), search.js, style.css (включно з мобільною версткою).src/main.js, src/preload.js — головний процес Electron і місток для десктопу.src/ai.js — запит до Claude API (промпт, модель, стрімінг).src/library.js — сканування папок і метадані книжок.src/convert.js — конвертація не-EPUB форматів через ebook-convert з Calibre.scripts/upload-books.mjs — завантаження книжок із папки до веб-бібліотеки.scripts/move-to-chytai.sh — разовий переїзд зі старого Fly-застосунку ai-reader-max на chytai.build/icon.svg, build/icon.png — іконка.