From 8bf7e11fcabfc5ba3375824d0cab7147644ff1dd Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Mon, 18 May 2026 14:27:24 +0600 Subject: [PATCH] =?UTF-8?q?[2026-05-18]=20business=20coaching:=20=D1=81?= =?UTF-8?q?=D0=B5=D1=81=D1=81=D0=B8=D1=8F=201=20W20=20=E2=80=94=20=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B4=D0=B8=D0=BD=D0=B3=20=D0=B4=D0=BE=2020.05,=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D1=85=20=D0=BF=D1=83=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=87=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BA=D0=B0=D0=BA=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- personal/business/profile.md | 5 +- personal/business/sessions/2026-W20.md | 78 +++++++++++++++++++ .../psychologist-app/marketing-strategy.md | 7 ++ wiki/tech/jellyfin-transcode-rpi5.md | 43 +++++++--- .../chat-path-onboarding-tracker-blocking.md | 40 ++++++---- 5 files changed, 146 insertions(+), 27 deletions(-) create mode 100644 personal/business/sessions/2026-W20.md diff --git a/personal/business/profile.md b/personal/business/profile.md index ec8aed26..e29fd925 100644 --- a/personal/business/profile.md +++ b/personal/business/profile.md @@ -95,8 +95,8 @@ related: | Цель | Шкала | Комментарий | |------|-------|-------------| | Первый платящий клиент | 1/10 | Нет ни одного | -| Понимание что делать следующим | 2/10 | Есть фреймворк its_capitan, нет конкретного плана | -| Маркетинг AI-психолога | 1/10 | Заморожен, есть стратегия на бумаге | +| Понимание что делать следующим | 4/10 | Есть план до Алматы, конкретное действие на среду | +| Маркетинг AI-психолога | 2/10 | Лендинг запланирован на 20.05 | | Использование DDG-данных | 1/10 | Никогда не применял | --- @@ -116,3 +116,4 @@ related: | Дата | Тема | Ключевые инсайты | |------|------|-----------------| | 2026-05-18 | Вводная | Паттерн «контейнер» в бизнес-контексте; DDG-поисковик как конкурентное преимущество; цель — break-even на первом проекте | +| 2026-05-18 | Сессия 1 — AI-психолог | Маркетинг уходит в postpone в реальном времени; реальный блок — страх публичности, не отсутствие навыка; договорённость: лендинг + пост в X до среды 20.05 | diff --git a/personal/business/sessions/2026-W20.md b/personal/business/sessions/2026-W20.md new file mode 100644 index 00000000..3f1bf4c2 --- /dev/null +++ b/personal/business/sessions/2026-W20.md @@ -0,0 +1,78 @@ +--- +created: '2026-05-18' +updated: '2026-05-18' +tags: + - business + - coaching + - sessions + - w20-2026 +related: + - '[[personal/business/profile]]' +--- +# Бизнес-сессия — 2026, неделя 20 + +> Первая рабочая сессия. 2026-05-18. Формат: GROW + WOOP, внешний наблюдатель. + +--- + +## OSKAR на входе + +| Цель | Шкала (до) | Шкала (после) | +|------|-----------|---------------| +| Первый платящий клиент | 1/10 | 1/10 | +| Понимание что делать следующим | 2/10 | 4/10 | +| Маркетинг AI-психолога | 1/10 | 2/10 | +| Использование DDG-данных | 1/10 | 1/10 | + +--- + +## Контекст сессии + +Запрос: «волшебный пендель» + понять стоит ли продолжать AI-психолога. Быстро выяснилось что решение уже принято — нужен не анализ, а движение. + +--- + +## Ключевые наблюдения + +### 1. Маркетинг уходит в postpone в реальном времени +Человек описывает план действий и самостоятельно замечает как маркетинг перемещается в конец очереди. Добавляет: «мне от этого спокойнее». Механизм избегания описан в момент срабатывания. + +### 2. Очередь перед маркетингом +Сформирована цепочка: проверить приложение → TestFlight → друзья → фидбек → итерации → публичный маркетинг → платящий клиент. В цепочке отсутствует параллельность — всё последовательно, маркетинг в конце. + +### 3. Реальный блок — не технический +«Нет канала», «нет аудитории», «нет плана» — перечислены как препятствия. При давлении все оказались устранимы за один день. Реальный блок: «я не писатель и не продажник». При уточнении: умеет, но это «очень много работы» и страшно делать публично. + +### 4. Формула «вот настрою — и заживу» +DDG-проект как текущая отговорка. Человек сам называет это «ADHD профиль». После DDG следующая отговорка уже ждёт в очереди — это озвучено и принято. + +### 5. ООО и Apple Dev — уточнение +Получать деньги как физлицо из КР/РФ через App Store нельзя. ООО в Алматы (июнь) — необходимо для монетизации. TestFlight и Individual Developer аккаунт ($99) — можно без ООО, для беты. + +--- + +## WOOP + +| Шаг | Содержание | +|-----|-----------| +| Wish | Лендинг «private beta» + первый публичный пост | +| Outcome | Люди знают что строится, можно собирать интерес до запуска | +| Obstacle | «Я не писатель и не продажник» — страх публичности, не отсутствие навыка | +| Plan (if-then) | Среда 2026-05-20: сделать лендинг + первый пост в X (старый аккаунт, обновить bio) | + +--- + +## Договорённости + +- [ ] **Среда 20.05** — лендинг «private beta / coming soon» + первый пост в X +- [ ] Сегодня вечером — проверить приложение на себе (запланированная сессия) +- [ ] До Алматы (июнь) — составить конкретный план действий по ООО + App Store Organization account +- [ ] Зарегистрировать Apple Developer Individual ($99) — для TestFlight беты, без ООО + +--- + +## Открытые вопросы + +- Как «оживить» старый X аккаунт — стратегия первых постов (разобрать отдельно) +- Нужен ли отдельный TG канал или стартовать с X +- Параллельный маркетинг vs последовательный — пока выбран последовательный, это риск diff --git a/personal/projects/psychologist-app/marketing-strategy.md b/personal/projects/psychologist-app/marketing-strategy.md index e298dfba..c56dcf0e 100644 --- a/personal/projects/psychologist-app/marketing-strategy.md +++ b/personal/projects/psychologist-app/marketing-strategy.md @@ -1,4 +1,11 @@ # 🧠 Маркетинговая стратегия AI-приложения рефлексии + +> **⚡ Обновление 2026-05-18 (коуч-сессия):** +> Маркетинг запускается ПАРАЛЛЕЛЬНО с доработкой продукта — не после. +> Первый шаг: лендинг «private beta / coming soon» + тизер-пост в X → **до 20.05 (среда)**. +> X: старый аккаунт (@alexey martemianov) — обновить bio, не создавать новый. +> ООО в Алматы (июнь) нужно для получения денег через App Store. TestFlight — без ООО, Individual Apple Dev $99. +> Apple Developer Individual аккаунт регистрировать сейчас. **"Marketing First" — органический рост без платной рекламы** > Исследование подготовлено автоматически | Май 2026 diff --git a/wiki/tech/jellyfin-transcode-rpi5.md b/wiki/tech/jellyfin-transcode-rpi5.md index 424e4663..d7228585 100644 --- a/wiki/tech/jellyfin-transcode-rpi5.md +++ b/wiki/tech/jellyfin-transcode-rpi5.md @@ -32,20 +32,41 @@ PGS и ASS (SSA) субтитры вызывают **burn-in** — Jellyfin ре ## Решение: конвертация PGS → SRT -Для всей библиотеки конвертировать PGS-субтитры в SRT через `pgsrip`: - +Установка через uv (arm64/aarch64 совместимо): ```bash -# Установка -pip install pgsrip - -# Конвертация одного файла (MKV с PGS) -pgsrip film.mkv --language rus - -# Массовая конвертация -find /media -name "*.mkv" | xargs -I{} pgsrip "{}" --language rus +~/.local/bin/uv tool install pgsrip +sudo apt-get install -y libgl1 libglib2.0-0 tesseract-ocr tesseract-ocr-rus tesseract-ocr-eng ``` -После конвертации: внешние `.srt` файлы Jellyfin читает без транскода. +Скрипт конвертации: +``` +/srv/dev-disk-by-uuid.../docker/media-pipeline/pgs-to-srt.sh +``` + +```bash +# один файл +pgs-to-srt.sh /media/movies/Film.mkv + +# вся директория +pgs-to-srt.sh /media +``` + +Логи: `/srv/.../docker/media-pipeline/pgs-to-srt.log` + +Скрипт: +- Скипает файлы без PGS-дорожек (S_HDMV) +- Скипает если .srt уже есть рядом +- Пишет лог с timestamp + +После конвертации Jellyfin читает внешние `.srt` без транскода. + +## Transmission completion hook + +Хук `/config/on-download-complete.sh` (монтируется в контейнер `:ro`) после завершения загрузки: +1. Запускает media-pipeline sync +2. Запускает pgs-to-srt.sh для скачанного файла/директории + +Лог: `/srv/.../docker/media-pipeline/download-complete.log` ## Итог по субтитрам diff --git a/work/wiki/apple-browsers/chat-path-onboarding-tracker-blocking.md b/work/wiki/apple-browsers/chat-path-onboarding-tracker-blocking.md index a10a6f10..9c0730b0 100644 --- a/work/wiki/apple-browsers/chat-path-onboarding-tracker-blocking.md +++ b/work/wiki/apple-browsers/chat-path-onboarding-tracker-blocking.md @@ -217,7 +217,7 @@ All resolved on GitHub. Fixed in later commits on the `#4544` branch. **Fix:** Removed `isChatPath` conditional from `NewTabDaxDialogFactory.createFinalDialog` — both factories now always use standard EOJ message + `daxDialogsEndOfJourneyNewTabUnique` pixel. Deleted test `testWhenChatPathEOJState_AndFinalDialogAppears_ThenFiresDuckAIExperimentFinalDialogPixel` (tested dead code); simplified remaining final-dialog tests. -**State:** ✅ Fixed in `alex/demo-tracker-blocking-onboarding` working tree (2026-05-18). Not yet committed. +**State:** ✅ Fixed and committed (2026-05-18). GitHub thread resolved on GitHub. --- @@ -229,7 +229,7 @@ All resolved on GitHub. Fixed in later commits on the `#4544` branch. **Fix:** `if contextualOnboardingLogic.chatPathPhase == .trackerToEOJ { delegate?.tabDidRequestNewTab(self) }` in `didTapDismissContextualOnboardingAction` (`TabViewController.swift:4206`). -**State:** ✅ Fix in `alex/demo-tracker-blocking-onboarding` (landed via PR #4584 merge, 2026-05-18). GitHub thread on PR #4544 still open — needs resolving. +**State:** ✅ Fix landed via PR #4584 merge. GitHub thread **resolved** on GitHub. --- @@ -241,7 +241,19 @@ All resolved on GitHub. Fixed in later commits on the `#4544` branch. **Fix:** Resolved by removing the dead branch from `NewTabDaxDialogFactory` (see r3234446893 entry above). Both factories now symmetric. -**State:** ✅ Fixed in `alex/demo-tracker-blocking-onboarding` working tree (2026-05-18). Not yet committed. +**State:** ✅ Fixed and committed (2026-05-18). GitHub thread resolved on GitHub. + +--- + +### ✅ PR #4544 — Bugbot (r3257196584): Chat-path subscription promo unreachable after EOJ dismissal + +**Source:** [Bugbot r3257196584 on PR #4544](https://github.com/duckduckgo/apple-browsers/pull/4544#discussion_r3257196584), `NewTabPageViewController.swift:355-374` and `DaxDialogs.swift:407-419`. + +**Issue:** In `finishDismissal` (inside `showDuckAIOnboardingCompletionDialog`), `nextHomeScreenMessageNew()` was called while `browsingFinalDialogShown` was still `false`. `peekNextHomeScreenMessageExperiment()` took the chat-path branch (not the `finalDaxDialogSeen` branch) and returned `nil`. The else branch then called `daxDialogsManager.dismiss()` which atomically set `browsingFinalDialogShown = true` and `isDismissed = true`, making `isEnabled = false`. Any subsequent call returned `nil` unconditionally — subscription promo was unreachable. + +**Fix:** Call `setFinalOnboardingDialogSeen()` before `nextHomeScreenMessageNew()` in `finishDismissal`. Added `setFinalOnboardingDialogSeen()` to `NewTabDialogSpecProvider` protocol; added stub to `MockNewTabDialogSpecProvider`. + +**State:** ✅ Fixed and committed (2026-05-18). GitHub thread still **open** — needs resolving. --- @@ -389,23 +401,23 @@ All resolved on GitHub. Fixed in later commits on the `#4544` branch. > Threads in GitHub order. -### 🔴 PR #4668 — Bugbot (OnboardingIntroViewModel.swift:473): Hardcoded debug `return` +### ⭕ PR #4668 — Bugbot (OnboardingIntroViewModel.swift:473): Hardcoded debug `return` **Source:** Bugbot on PR #4668, `OnboardingIntroViewModel.swift:473` -**Issue:** A hardcoded `return .treatmentB` debug shortcut bypasses the feature flag in `resolveDuckAIQueryExperimentCohortID()`. Must be removed before shipping. +**Issue:** Hardcoded `return .treatmentA` bypasses feature flag in `resolveDuckAIQueryExperimentCohortID()`. -**State:** 🔴 [OPEN] on GitHub. Same item appears on PR #4855 (Bugbot line 473). Not yet removed on #4668 branch. +**State:** ⭕ Removed and pushed on #4668 branch. GitHub thread still open — needs resolving. --- -### 🔴 PR #4668 — Bugbot (FeatureFlag.swift:635): Commented-out `Config(...)` line +### ⭕ PR #4668 — Bugbot (FeatureFlag.swift:635): Commented-out `Config(...)` line **Source:** Bugbot on PR #4668, `FeatureFlag.swift:635` **Issue:** `defaultValue: .enabled` override was added to `unifiedToggleInput` for testing, plus the old `// Config(...)` line still sits underneath as dead commented-out code. Both need to be removed before merging. -**State:** 🔴 Still in code on the `#4668` branch. NOT fixed. GitHub thread NOT resolved. +**State:** ⭕ TODO — still in code on `#4668` branch. Deferred until main PR (#4544) is done. --- @@ -415,27 +427,27 @@ All resolved on GitHub. Fixed in later commits on the `#4544` branch. **Issue:** Method added to `BrowserChromeDelegate` protocol and implemented, but no caller exists. -**State:** 🔴 [OPEN] on GitHub. See also BrowserChromeManager item below — same root issue. +**State:** 🔴 [OPEN] on GitHub. Deferred until #4544 is done — see BrowserChromeManager item below for full detail. --- -### 🔴 PR #4668 — aataraxiaa (FeatureFlag.swift:635): Commented-out config line +### ⭕ PR #4668 — aataraxiaa (FeatureFlag.swift:635): Commented-out config line **Source:** [aataraxiaa review comment on PR #4668](https://github.com/duckduckgo/apple-browsers/pull/4668), `FeatureFlag.swift:635` **Issue:** Same commented-out `Config(...)` dead code flagged by Bugbot above. aataraxiaa also requests it be removed. -**State:** 🔴 [OPEN] on GitHub. Not yet fixed. +**State:** ⭕ TODO — GitHub thread [OPEN]. Deferred until #4544 is done. --- -### 🔴 PR #4668 — Bugbot (BrowserChromeManager.swift:43): New protocol method no callers +### 🔴 PR #4668 — Bugbot (BrowserChromeManager.swift:43) `r3234513817`: New protocol method no callers **Source:** Bugbot on PR #4668, `BrowserChromeManager.swift:43` -**Issue:** `embedInUnifiedInputEditingAreaIfActive` added to `BrowserChromeDelegate` protocol and implemented in `BrowserChromeManager`, but no caller exists anywhere in the codebase. +**Issue:** `embedInUnifiedInputEditingAreaIfActive` added to `BrowserChromeDelegate` protocol and implemented, but no caller exists. The NTP's `embedDialogInEditingState` and `showDuckAIOnboardingCompletionDialogInUTI` both embed by casting `parent as? MainViewController` directly instead of going through this protocol method. Additionally the **implementations differ**: the protocol method pins to `navigationBarContainer.bottomAnchor`, while actual NTP embedding pins to `coordinator.viewController.view.bottomAnchor`. So simply adding a caller is not enough — implementations must be aligned first. -**State:** On `sr-feedback` branch commit `82bb0f71e3` removed `embedDialogInEditingState` dead code; the protocol method may now be entirely unreachable. **Needs verification on #4668 branch.** GitHub thread NOT resolved. → Either add a caller or remove the method and its implementation. +**State:** 🔴 [OPEN] on GitHub. Deferred until #4544 is done. Fix = align implementations + wire caller, or remove the protocol method entirely. ---