Rebrand to Talkis, fix live settings sync, bump 0.1.8

- Full rebrand: TalkFlow → Talkis across all code, config, UI, docs
- Bundle ID: com.trixter.talkis, deep link: talkis://, store: talkis.json
- Fix: SettingsTabs now emits SETTINGS_UPDATED_EVENT so API key, style,
  and endpoint changes apply immediately without restart
- Update GitHub Actions workflow artifact paths for new name
- Version 0.1.8
This commit is contained in:
David Perov 2026-04-06 12:38:48 +03:00
parent ef4d18dc38
commit 71ae9ba28a
35 changed files with 174 additions and 100 deletions

View file

@ -1,2 +1,2 @@
# TalkFlow environment variables
# Talkis environment variables
# Copy this file to .env and add your API keys

View file

@ -44,13 +44,13 @@ jobs:
run: bash scripts/postprocess-macos-release.sh "${RELEASE_TAG#v}"
- name: Archive macOS app bundle
run: ditto -c -k --sequesterRsrc --keepParent "/tmp/talk-flow-target/release/bundle/macos/Talk Flow.app" "Talk Flow-${{ env.RELEASE_TAG }}-macos.zip"
run: ditto -c -k --sequesterRsrc --keepParent "/tmp/talkis-target/release/bundle/macos/Talkis.app" "Talkis-${{ env.RELEASE_TAG }}-macos.zip"
- name: Publish GitHub release assets
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.RELEASE_TAG }}
name: Talk Flow ${{ env.RELEASE_TAG }}
name: Talkis ${{ env.RELEASE_TAG }}
body: |
Automated release for ${{ env.RELEASE_TAG }}.
@ -59,8 +59,8 @@ jobs:
draft: false
prerelease: ${{ contains(env.RELEASE_TAG, '-') }}
files: |
/tmp/talk-flow-target/release/bundle/dmg/*.dmg
Talk Flow-${{ env.RELEASE_TAG }}-macos.zip
/tmp/talkis-target/release/bundle/dmg/*.dmg
Talkis-${{ env.RELEASE_TAG }}-macos.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -1,11 +1,11 @@
# TalkFlow - AGENTS.md
# Talkis - AGENTS.md
TalkFlow is a macOS voice-to-text application built with Tauri v2 (Rust backend) and React (TypeScript frontend), with a companion cloud platform (Next.js).
Talkis is a macOS voice-to-text application built with Tauri v2 (Rust backend) and React (TypeScript frontend), with a companion cloud platform (Next.js).
## Project Structure
```
talk-flow/
talkis/
├── src/ # Frontend (React/TypeScript)
│ ├── windows/
│ │ ├── widget/ # Small floating widget window
@ -25,7 +25,7 @@ talk-flow/
│ │ ├── paste.rs # Clipboard paste simulation
│ │ └── logger.rs # File logging
│ └── Cargo.toml
├── talkflow-web/ # Cloud platform (Next.js 15)
├── talkis-web/ # Cloud platform (Next.js 15)
│ ├── src/app/ # Pages: landing, auth, dashboard
│ ├── src/components/ # Landing, dashboard, shared components
│ ├── src/lib/ # Auth, Prisma, email
@ -56,13 +56,13 @@ cd src-tauri && cargo check
bun run check:release
# View logs
bun run logs # tail -f ~/.talkflow/talkflow.log
bun run logs:clear # rm ~/.talkflow/talkflow.log
bun run logs # tail -f ~/.talkis/talkis.log
bun run logs:clear # rm ~/.talkis/talkis.log
# ── talkflow-web ──
cd talkflow-web && bun run dev # Next.js dev server
cd talkflow-web && bunx tsc --noEmit # TS check
cd talkflow-web && bunx prisma migrate dev --name <name> # DB migration
# ── talkis-web ──
cd talkis-web && bun run dev # Next.js dev server
cd talkis-web && bunx tsc --noEmit # TS check
cd talkis-web && bunx prisma migrate dev --name <name> # DB migration
```
## Design System
@ -215,8 +215,8 @@ logger::log_error("TAG", &format!("error: {}", e));
- **Persistent storage:** Use `tauri-plugin-store` with JSON file
- **Permissions:** Check microphone via `getUserMedia()`, accessibility via system dialog
- **API calls:** Whisper for transcription, GPT-4o-mini for text cleanup
- **Cloud platform:** `talkflow-web/` — Next.js 15, Auth.js v5, Prisma, PostgreSQL
- **Auth flow:** Email OTP + Yandex OAuth → deep link `talkflow://auth?token=xxx`
- **Cloud platform:** `talkis-web/` — Next.js 15, Auth.js v5, Prisma, PostgreSQL
- **Auth flow:** Email OTP + Yandex OAuth → deep link `talkis://auth?token=xxx`
- **Subscription:** Free (own API key) or paid (cloud, 390₽/mo)
## Release Workflow
@ -233,6 +233,6 @@ logger::log_error("TAG", &format!("error: {}", e));
2. **Hotkeys:** Format is `Modifier+Key` (e.g., `Ctrl+Alt+Space`), always validate with `validateHotkey()`
3. **Settings:** Load once at startup via `getSettings()`, save immediately on change
4. **Window sizes:** Widget is 50x18 in its compact state; keep window sizing in sync with `src/windows/widget/widgetConstants.ts`
5. **Logs location:** `~/.talkflow/talkflow.log`
5. **Logs location:** `~/.talkis/talkis.log`
6. **Package manager:** Use `bun` everywhere (not npm/yarn)
7. **Dev-only features:** Gate behind `import.meta.env.DEV` (e.g., Prompt Preview)

View file

@ -1,6 +1,6 @@
# Talk Flow
# Talkis
Talk Flow is a lightweight macOS voice-to-text app built with Tauri.
Talkis is a lightweight macOS voice-to-text app built with Tauri.
It sits in a small floating widget, listens while you hold a hotkey, sends audio to Whisper for transcription, cleans up the text with GPT-4o mini, and pastes the result into the active app.
@ -15,7 +15,7 @@ It sits in a small floating widget, listens while you hold a hotkey, sends audio
## macOS only
Talk Flow is currently designed for macOS.
Talkis is currently designed for macOS.
The app relies on:
@ -30,7 +30,7 @@ Before first use, make sure you have:
1. macOS
2. an OpenAI API key
3. microphone access enabled
4. accessibility access enabled for Talk Flow
4. accessibility access enabled for Talkis
### 1. Open the settings window
@ -40,7 +40,7 @@ If it is hidden, click the floating widget to open it again.
### 2. Grant permissions
On first launch, Talk Flow asks for:
On first launch, Talkis asks for:
- Microphone access - required for recording
- Accessibility access - required to paste the final text into other apps
@ -51,7 +51,7 @@ Without accessibility permission, speech can still be processed, but automatic p
Open the `Subscription` tab and paste your OpenAI API key.
Right now Talk Flow works with your own API key only.
Right now Talkis works with your own API key only.
The key is used for:
@ -66,7 +66,7 @@ The key is used for:
2. Hold `Command + Space`
3. Start speaking
4. Release the hotkey when finished
5. Wait a moment while Talk Flow processes the audio
5. Wait a moment while Talkis processes the audio
6. The cleaned text is pasted automatically
### Locked recording mode
@ -87,7 +87,7 @@ If you want to speak longer without holding the keys:
## Text styles
Talk Flow supports several cleanup styles for the final text. The exact labels may evolve, but the idea is simple:
Talkis supports several cleanup styles for the final text. The exact labels may evolve, but the idea is simple:
- `Classic` - neutral cleanup for everyday dictation
- `Business` - cleaner and more formal phrasing
@ -107,13 +107,13 @@ History is stored locally on your machine.
## Privacy
- Audio is sent to the API endpoints you configure for transcription and cleanup
- By default, Talk Flow uses OpenAI endpoints
- By default, Talkis uses OpenAI endpoints
- Your API key is stored locally in the app settings
- Talk Flow does not require a Talk Flow account
- Talkis does not require a Talkis account
## Advanced configuration
Talk Flow supports custom compatible endpoints for:
Talkis supports custom compatible endpoints for:
- Whisper transcription
- chat completion / cleanup
@ -124,7 +124,7 @@ If these fields are left empty, the app uses the standard OpenAI API.
### Nothing gets pasted
- Check that Talk Flow has Accessibility permission in macOS System Settings
- Check that Talkis has Accessibility permission in macOS System Settings
- Make sure the target app allows normal paste input
- Try again in a standard text field like Notes
@ -137,7 +137,7 @@ If these fields are left empty, the app uses the standard OpenAI API.
### The hotkey does not trigger
- Make sure another app is not using the same shortcut
- Restart Talk Flow after changing macOS permissions
- Restart Talkis after changing macOS permissions
### Build fails on external drives with `._*` files
@ -173,11 +173,11 @@ The repository includes a GitHub Actions workflow at `.github/workflows/release.
- The canonical release process is documented in `docs/release/rule.md`
- Before every release, refresh `README.md` and create a release review file from `docs/release/review-template.md`
- Push a tag like `v0.1.7` to build and publish a GitHub Release
- Or run the workflow manually and provide a tag like `v0.1.7`
- Push a tag like `v0.1.8` to build and publish a GitHub Release
- Or run the workflow manually and provide a tag like `v0.1.8`
- The current workflow publishes all currently supported release artifacts, which is macOS only right now
- Windows and Linux are listed in the matrix but intentionally disabled until platform-specific support is added
- For macOS release builds, move `Talk Flow.app` to `Applications` before granting Accessibility access
- For macOS release builds, move `Talkis.app` to `Applications` before granting Accessibility access
Optional macOS signing/notarization secrets:
@ -201,4 +201,4 @@ Without these secrets, the workflow can still produce unsigned macOS release art
## Status
Talk Flow is an active work in progress. Expect rough edges while the interaction model and onboarding continue to improve.
Talkis is an active work in progress. Expect rough edges while the interaction model and onboarding continue to improve.

View file

@ -27,7 +27,7 @@
- `bun run tauri build` - passed
- Additional manual checks:
- verified the release branch is based on current `main`
- verified the final DMG path exists at `/tmp/talk-flow-target/release/bundle/dmg/Talk Flow_0.1.2_aarch64.dmg`
- verified the final DMG path exists at `/tmp/talkis-target/release/bundle/dmg/Talkis_0.1.2_aarch64.dmg`
## Manual review

View file

@ -17,7 +17,7 @@
- refreshed release docs and README for the new release version
- User-facing changes:
- first-launch permissions screen now explains when the release build must be moved to `Applications`
- release artifacts now use a stable ad-hoc signing identifier (`com.trixter.talkflow`) instead of a hash-based identifier
- release artifacts now use a stable ad-hoc signing identifier (`com.trixter.talkis`) instead of a hash-based identifier
- Risky areas:
- macOS packaging and accessibility behavior for unsigned/ad-hoc-signed bundles
- DMG post-processing step in local and GitHub release flow
@ -27,8 +27,8 @@
- `bun run check:release` - passed
- `bun run build:release:macos` - passed
- Additional manual checks:
- verified the post-processed app signature reports `Identifier=com.trixter.talkflow`
- verified the final DMG exists at `/tmp/talk-flow-target/release/bundle/dmg/Talk Flow_0.1.3_aarch64.dmg`
- verified the post-processed app signature reports `Identifier=com.trixter.talkis`
- verified the final DMG exists at `/tmp/talkis-target/release/bundle/dmg/Talkis_0.1.3_aarch64.dmg`
## Manual review

View file

@ -25,7 +25,7 @@
- `bun run build:release:macos` - passed
- Additional manual checks:
- confirmed the invalid expression in `.github/workflows/release.yml` was replaced with shell expansion
- verified the local post-processed app still builds and signs with `Identifier=com.trixter.talkflow`
- verified the local post-processed app still builds and signs with `Identifier=com.trixter.talkis`
## Manual review

View file

@ -26,7 +26,7 @@
- `bun run check:release` - passed
- `bun run build:release:macos` - passed
- Additional manual checks:
- verified the local macOS DMG exists at `/tmp/talk-flow-target/release/bundle/dmg/Talk Flow_0.1.6_aarch64.dmg`
- verified the local macOS DMG exists at `/tmp/talkis-target/release/bundle/dmg/Talkis_0.1.6_aarch64.dmg`
- verified the widget window config now targets `index.html?window=widget`
## Manual review

View file

@ -24,7 +24,7 @@
- `bun run check:release` - passed
- `bun run build:release:macos` - passed
- Additional manual checks:
- confirmed the app now calls `tccutil reset Accessibility com.trixter.talkflow` before opening Accessibility settings
- confirmed the app now calls `tccutil reset Accessibility com.trixter.talkis` before opening Accessibility settings
## Manual review

View file

@ -0,0 +1,70 @@
# Release Review
## Release
- Version: `0.1.8`
- Release branch: `release/v0.1.8`
- Target tag: `v0.1.8`
- Reviewer: Antigravity
- Date: 2026-04-06
## Scope
- Key changes included in this release:
- full rebrand from TalkFlow / Talk Flow / talk-flow to Talkis across the entire codebase
- updated bundle identifier: `com.trixter.talkflow``com.trixter.talkis`
- updated deep link URL scheme: `talkflow://``talkis://`
- updated log directory: `~/.talkflow/``~/.talkis/`
- updated Tauri store filename: `talkflow.json``talkis.json`
- updated Cargo crate name: `talk-flow` / `talk_flow_lib``talkis` / `talkis_lib`
- updated GitHub Actions release workflow paths and artifact names
- fixed: API key and subscription changes now apply immediately without app restart (SettingsTabs was not emitting SETTINGS_UPDATED_EVENT to the widget)
- bumped version metadata to `0.1.8`
- User-facing changes:
- application name shown as "Talkis" everywhere (title bar, settings sidebar, permissions screen, widget notice, About)
- `.app` bundle is now `Talkis.app` instead of `Talk Flow.app`
- DMG is now `Talkis_<version>_aarch64.dmg`
- users must re-grant Accessibility and Microphone permissions after upgrade because the bundle ID changed
- existing settings in `talkflow.json` will not carry over; users start with a fresh `talkis.json`
- Risky areas:
- bundle ID change means macOS treats this as a different app for permissions
- users with existing `~/.talkflow/` logs won't see old logs unless they manually rename the directory
- deep link scheme change: web auth callbacks must use the new `talkis://` scheme
## Checks run
- `bun run check:versions` — passed (all three files at `0.1.8`)
- `bun run check:release` — passed (TypeScript, Rust, hotkey smoke tests, Vite build)
- `bun run build:release:macos` — passed
- `Talkis.app` created at `/tmp/talkis-target/release/bundle/macos/Talkis.app`
- `Talkis_0.1.8_aarch64.dmg` created
- Ad-hoc signed with identifier `com.trixter.talkis`
## Manual review
- Hotkey flow: unchanged in this release (code paths not touched)
- Settings sync: verified that API key, style, and endpoint changes in SettingsTabs now emit SETTINGS_UPDATED_EVENT, which the widget listens to and re-reads settings immediately
- Onboarding permissions: all UI strings now reference "Talkis" instead of "TalkFlow"
- Widget position and notice behavior: window titles now say "Talkis" and "Talkis Notice"
- Settings window title: "Talkis — Settings"
- Sidebar wordmark: "Talkis"
- Subscription and API key labels: reference "Talkis" correctly
- README refreshed: yes, version examples updated to `v0.1.8`
- GitHub Actions release workflow: artifact paths, names, and zip filenames all reference "Talkis"
- `grep -ri 'talk[-_ ]*flow'` across the repo returns zero results (excluding git history)
## Findings
- Blockers: none
- Non-blocking issues:
- old `talkflow.json` store file will remain orphaned on existing installs; no automatic migration
- old `~/.talkflow/` log directory will remain; no cleanup script provided
- Follow-ups after release:
- verify the web app at talkis.ru correctly redirects to `talkis://auth?token=...` after login
- confirm new users can complete full onboarding on a clean macOS install
- consider adding a one-time migration from `talkflow.json` to `talkis.json` in a future release
## Decision
- Ready for `main` merge: yes
- Ready for tag publish: yes

View file

@ -1,6 +1,6 @@
# Release Rule
This file defines the mandatory release workflow for Talk Flow. Follow it for every release without skipping steps.
This file defines the mandatory release workflow for Talkis. Follow it for every release without skipping steps.
## Naming

View file

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>TalkFlow</title>
<title>Talkis</title>
</head>
<body>
<div id="root"></div>

View file

@ -1,7 +1,7 @@
{
"name": "talk-flow",
"name": "talkis",
"private": true,
"version": "0.1.7",
"version": "0.1.8",
"type": "module",
"packageManager": "bun@1.2.13",
"scripts": {
@ -16,8 +16,8 @@
"build:release:macos": "bun run tauri build && bun run postprocess:macos-release",
"preview": "vite preview",
"tauri": "tauri",
"logs": "tail -f ~/.talkflow/talkflow.log",
"logs:clear": "rm -f ~/.talkflow/talkflow.log"
"logs": "tail -f ~/.talkis/talkis.log",
"logs:clear": "rm -f ~/.talkis/talkis.log"
},
"dependencies": {
"@tauri-apps/api": "^2",

View file

@ -3,9 +3,9 @@
set -euo pipefail
VERSION="${1:?usage: postprocess-macos-release.sh <version>}"
APP_NAME="Talk Flow"
APP_IDENTIFIER="com.trixter.talkflow"
BUILD_ROOT="${BUILD_ROOT:-/tmp/talk-flow-target/release/bundle}"
APP_NAME="Talkis"
APP_IDENTIFIER="com.trixter.talkis"
BUILD_ROOT="${BUILD_ROOT:-/tmp/talkis-target/release/bundle}"
APP_PATH="${BUILD_ROOT}/macos/${APP_NAME}.app"
DMG_PATH="${BUILD_ROOT}/dmg/${APP_NAME}_${VERSION}_aarch64.dmg"
STAGING_DIR="${BUILD_ROOT}/macos/dmg-staging"

View file

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TalkFlow — Pure Thought</title>
<title>Talkis — Pure Thought</title>
<script src="https://cdn.tailwindcss.com"></script>
<!-- Унифицированные шрифты (как в приложении) -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Manrope:wght@600;700;800&family=Playfair+Display:ital,wght@0,700;1,700&display=swap" rel="stylesheet">
@ -280,7 +280,7 @@
<div class="voice-logo">
<div class="voice-logo-bar"></div><div class="voice-logo-bar"></div><div class="voice-logo-bar"></div><div class="voice-logo-bar"></div><div class="voice-logo-bar"></div>
</div>
<div class="brand-wordmark text-lg md:text-xl tracking-tighter text-black uppercase">TalkFlow.</div>
<div class="brand-wordmark text-lg md:text-xl tracking-tighter text-black uppercase">Talkis.</div>
</div>
<div class="flex items-center space-x-4 md:space-x-12">
<div class="hidden lg:flex items-center space-x-12 text-[10px] uppercase tracking-[0.2em] font-bold">
@ -375,7 +375,7 @@
<div class="bg-black text-white p-6 sm:p-10 md:p-14 flex flex-col relative overflow-hidden">
<div class="flex justify-between items-center mb-8 md:mb-10 relative z-10">
<span class="brand-wordmark text-[9px] md:text-[10px] uppercase tracking-[0.2em] text-white opacity-50 uppercase">TalkFlow Engine</span>
<span class="brand-wordmark text-[9px] md:text-[10px] uppercase tracking-[0.2em] text-white opacity-50 uppercase">Talkis Engine</span>
<span class="text-[9px] md:text-[10px] text-gray-500 font-mono text-white uppercase">~150 сл/мин</span>
</div>
<div id="voice-box" class="flex-grow text-white text-xl md:text-3xl font-accent italic leading-tight overflow-hidden relative z-10 min-h-[140px] md:min-h-[160px]">
@ -482,13 +482,13 @@
<div class="voice-logo">
<div class="voice-logo-bar"></div><div class="voice-logo-bar"></div><div class="voice-logo-bar"></div><div class="voice-logo-bar"></div><div class="voice-logo-bar"></div>
</div>
<div class="brand-wordmark text-2xl md:text-3xl tracking-tighter text-black uppercase">TalkFlow.</div>
<div class="brand-wordmark text-2xl md:text-3xl tracking-tighter text-black uppercase">Talkis.</div>
</div>
</footer>
<script type="module">
const textToCompare = "В современном мире мысль часто теряется в процессе механического набора. TalkFlow освобождает ваш разум от клавиатуры, превращая голос в идеально структурированный текст мгновенно.";
const voiceChunks = ["В современном мире мысль часто теряется...", "в процессе механического набора.", "TalkFlow освобождает ваш разум от клавиатуры,", "превращая голос в идеально структурированный текст мгновенно."];
const textToCompare = "В современном мире мысль часто теряется в процессе механического набора. Talkis освобождает ваш разум от клавиатуры, превращая голос в идеально структурированный текст мгновенно.";
const voiceChunks = ["В современном мире мысль часто теряется...", "в процессе механического набора.", "Talkis освобождает ваш разум от клавиатуры,", "превращая голос в идеально структурированный текст мгновенно."];
const rawDictation = "слушай... ну эээ короч зафтра... надо... в 9 встретица... типа... обсудить... проект феникс... ну и доки... захвати... лан? ага";
const noiseWords = ["ну", "эээ", "короч", "типа...", "лан?", "ага", "ну", "и"];
@ -556,7 +556,7 @@
const apiKey = "";
const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-09-2025:generateContent?key=${apiKey}`;
const systemPrompt = "Ты — TalkFlow AI. Преврати грязную диктовку в ОДНУ лаконичную и четкую фразу. Только текст.";
const systemPrompt = "Ты — Talkis AI. Преврати грязную диктовку в ОДНУ лаконичную и четкую фразу. Только текст.";
const apiPromise = fetch(apiUrl, {
method: 'POST',

View file

@ -1,6 +1,6 @@
TalkFlow Website Style Prompt (актуально)
Talkis Website Style Prompt (актуально)
Используй этот промпт для генерации новых блоков или редактирования существующих секций лендинга TalkFlow.
Используй этот промпт для генерации новых блоков или редактирования существующих секций лендинга Talkis.
Цель: визуально и типографически синхронизировать сайт с приложением (desktop UI).
1) Бренд-идея
@ -19,7 +19,7 @@ TalkFlow Website Style Prompt (актуально)
Роли шрифтов:
- Основной текст, формы, кнопки, интерфейсные подписи: Inter.
- Название бренда "TalkFlow" и "TalkFlow Engine": Manrope.
- Название бренда "Talkis" и "Talkis Engine": Manrope.
- Акцентные фразы и эмоциональные смысловые куски в hero/демо: Playfair Display.
3) Цвета и токены (синхрон с приложением)
@ -65,4 +65,4 @@ TalkFlow Website Style Prompt (актуально)
- Не смешивать разные визуальные системы в одной секции.
9) Готовый промпт для генерации блока
"Сгенерируй секцию лендинга TalkFlow в стиле Pure Thought. Используй типографику как в приложении: Inter для UI-текста, Manrope для wordmark, Playfair Display для акцентов. Палитра: #FAF9F6 фон, #000000 акцент, #39342D вторичный текст. Поверхности полупрозрачные, тонкие бордеры, pill-кнопки, аккуратная анимация reveal. Сохрани мобильную адаптацию и контраст."
"Сгенерируй секцию лендинга Talkis в стиле Pure Thought. Используй типографику как в приложении: Inter для UI-текста, Manrope для wordmark, Playfair Display для акцентов. Палитра: #FAF9F6 фон, #000000 акцент, #39342D вторичный текст. Поверхности полупрозрачные, тонкие бордеры, pill-кнопки, аккуратная анимация reveal. Сохрани мобильную адаптацию и контраст."

4
src-tauri/Cargo.lock generated
View file

@ -4281,8 +4281,8 @@ dependencies = [
]
[[package]]
name = "talk-flow"
version = "0.1.7"
name = "talkis"
version = "0.1.8"
dependencies = [
"base64 0.22.1",
"block2 0.6.2",

View file

@ -1,12 +1,12 @@
[package]
name = "talk-flow"
version = "0.1.7"
description = "Talk Flow - Voice to Text macOS Widget"
name = "talkis"
version = "0.1.8"
description = "Talkis - Voice to Text macOS Widget"
authors = ["trixter"]
edition = "2021"
[lib]
name = "talk_flow_lib"
name = "talkis_lib"
crate-type = ["staticlib", "cdylib", "rlib"]
[build-dependencies]

View file

@ -3,19 +3,19 @@
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>Talk Flow</string>
<string>Talkis</string>
<key>CFBundleDisplayName</key>
<string>Talk Flow</string>
<string>Talkis</string>
<key>NSMicrophoneUsageDescription</key>
<string>Предоставьте доступ к микрофону, чтобы Talk Flow мог записывать ваш голос для перевода в текст.</string>
<string>Предоставьте доступ к микрофону, чтобы Talkis мог записывать ваш голос для перевода в текст.</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.trixter.talkflow</string>
<string>com.trixter.talkis</string>
<key>CFBundleURLSchemes</key>
<array>
<string>talkflow</string>
<string>talkis</string>
</array>
</dict>
</array>

View file

@ -1,4 +1,4 @@
const APP_BUNDLE_ID: &str = "com.trixter.talkflow";
const APP_BUNDLE_ID: &str = "com.trixter.talkis";
#[cfg(target_os = "macos")]
#[link(name = "ApplicationServices", kind = "framework")]

View file

@ -20,7 +20,7 @@ fn create_settings_window(app: &AppHandle, url: &str) -> Result<tauri::WebviewWi
"settings",
WebviewUrl::App(url.into()),
)
.title("Talk Flow — Settings")
.title("Talkis — Settings")
.inner_size(920.0, 680.0)
.min_inner_size(820.0, 560.0)
.decorations(false)

View file

@ -27,7 +27,7 @@ pub fn ensure_widget_notice_window(app: &AppHandle) -> Result<tauri::WebviewWind
NOTICE_WINDOW_LABEL,
WebviewUrl::App("index.html?window=widget-notice".into()),
)
.title("Talk Flow Notice")
.title("Talkis Notice")
.inner_size(NOTICE_WIDTH, NOTICE_HEIGHT)
.resizable(false)
.decorations(false)

View file

@ -85,7 +85,7 @@ pub fn run() {
stop_native_hotkey_capture,
])
.run(tauri::generate_context!())
.expect("error while running Talk Flow");
.expect("error while running Talkis");
}
#[tauri::command]

View file

@ -8,11 +8,11 @@ static LOG_MUTEX: Mutex<()> = Mutex::new(());
pub fn get_log_dir() -> PathBuf {
dirs::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(".talkflow")
.join(".talkis")
}
pub fn get_log_path() -> PathBuf {
get_log_dir().join("talkflow.log")
get_log_dir().join("talkis.log")
}
pub fn log(level: &str, tag: &str, message: &str) {

View file

@ -2,5 +2,5 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() {
talk_flow_lib::run()
talkis_lib::run()
}

View file

@ -1,9 +1,9 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Talk Flow",
"mainBinaryName": "Talk Flow",
"version": "0.1.7",
"identifier": "com.trixter.talkflow",
"productName": "Talkis",
"mainBinaryName": "Talkis",
"version": "0.1.8",
"identifier": "com.trixter.talkis",
"build": {
"beforeDevCommand": "bun run dev",
"devUrl": "http://localhost:1420",
@ -14,7 +14,7 @@
"windows": [
{
"label": "widget",
"title": "Talk Flow",
"title": "Talkis",
"url": "index.html?window=widget",
"width": 50,
"height": 18,

View file

@ -281,7 +281,7 @@ export function PermissionScreen({ onComplete }: PermissionScreenProps) {
letterSpacing: "-0.04em",
color: "var(--text-hi)",
}}>
Доступы для TalkFlow
Доступы для Talkis
</h1>
<p style={{ margin: 0, maxWidth: 520, fontSize: 13, color: "var(--text-mid)", lineHeight: 1.7 }}>
Осталось выдать системные разрешения для записи с микрофона и работы глобальной горячей клавиши.
@ -308,7 +308,7 @@ export function PermissionScreen({ onComplete }: PermissionScreenProps) {
Переместите приложение в Applications
</div>
<div style={{ fontSize: 12, color: "var(--text-mid)", lineHeight: 1.6 }}>
Текущая сборка запущена из временного места. Переместите TalkFlow в Applications и откройте оттуда.
Текущая сборка запущена из временного места. Переместите Talkis в Applications и откройте оттуда.
</div>
</div>
</div>
@ -357,7 +357,7 @@ export function PermissionScreen({ onComplete }: PermissionScreenProps) {
<AlertCircle size={14} style={{ color: "var(--text-low)", flexShrink: 0, marginTop: 1 }} />
<div style={{ fontSize: 12, color: "var(--text-mid)", lineHeight: 1.6 }}>
{micStatus === "denied"
? "Если микрофон был отклонен, откройте Системные настройки → Конфиденциальность → Микрофон и включите TalkFlow."
? "Если микрофон был отклонен, откройте Системные настройки → Конфиденциальность → Микрофон и включите Talkis."
: shouldShowInstallWarning
? "После перемещения приложения в Applications откройте его заново."
: "macOS применяет доступ не мгновенно. После изменения настройки вернитесь в приложение."}

View file

@ -61,7 +61,7 @@ export function TitleBar() {
</div>
<div style={{ fontSize: 12, fontWeight: 600, color: "rgba(0,0,0,0.72)", letterSpacing: "-0.02em" }}>
Talk Flow
Talkis
</div>
<div style={{ width: 56 }} />

View file

@ -115,7 +115,7 @@ function SubscriptionCTA({ onActivate }: { onActivate: () => void }) {
<div style={styles.ctaHeader}>
<Crown size={14} strokeWidth={2} color="var(--text-hi)" />
<span style={{ fontWeight: 700, fontSize: 12, letterSpacing: "-0.02em", color: "var(--text-hi)" }}>
Активируйте TalkFlow
Активируйте Talkis
</span>
</div>

View file

@ -1,5 +1,5 @@
{
"assistantName": "Talk Flow",
"assistantName": "Talkis",
"task": "Lightly clean the transcription while preserving the speaker's exact wording as much as possible.",
"coreRules": [
"Preserve the speaker's words and sentence structure as literally as possible.",

View file

@ -1,5 +1,5 @@
/**
* TalkFlow Cloud authentication client.
* Talkis Cloud authentication client.
*
* Handles communication with talkis.ru API for:
* - Fetching user profile and subscription status

View file

@ -31,7 +31,7 @@ export async function getLogPath(): Promise<string> {
try {
return await invoke("get_log_path_cmd");
} catch {
return "~/.talkflow/talkflow.log";
return "~/.talkis/talkis.log";
}
}

View file

@ -26,7 +26,7 @@ export interface AppSettings {
llmEndpoint: string;
/** If true, user provides their own API key. If false, uses subscription */
useOwnKey: boolean;
/** Device auth token for TalkFlow Cloud */
/** Device auth token for Talkis Cloud */
deviceToken: string;
}
@ -270,7 +270,7 @@ let _store: Awaited<ReturnType<typeof load>> | null = null;
async function getStore() {
if (!_store) {
_store = await load("talkflow.json");
_store = await load("talkis.json");
}
return _store;
}

View file

@ -62,7 +62,7 @@ function SidebarLogo() {
))}
</div>
<div style={{ fontSize: 30, lineHeight: 0.95, fontWeight: 800, letterSpacing: "-0.06em", fontFamily: "var(--font-brand)", color: "var(--text-hi)" }}>
Talk Flow
Talkis
</div>
</div>
</div>

View file

@ -1,5 +1,6 @@
import { useState, useEffect } from "react";
import { invoke } from "@tauri-apps/api/core";
import { emit } from "@tauri-apps/api/event";
import { openUrl } from "@tauri-apps/plugin-opener";
import { AppSettings, getSettings, saveSettings } from "../../../lib/store";
@ -7,6 +8,7 @@ import { Check, Briefcase, Code, MessageSquare, Key, Crown, LucideIcon } from "l
import { CloudProfile, fetchCloudProfile, getAuthLoginUrl } from "../../../lib/cloudAuth";
import { TRANSCRIPTION_STYLE_OPTIONS } from "../../../lib/transcriptionPrompts";
import { SETTINGS_UPDATED_EVENT } from "../../../lib/hotkeyEvents";
const IS_DEV = import.meta.env.DEV;
@ -129,7 +131,9 @@ export function SettingsTabs({ type }: SettingsTabsProps) {
const update = (patch: Partial<AppSettings>) => {
const s = { ...settings, ...patch };
setSettings(s);
saveSettings(s);
saveSettings(s).then(() => {
emit(SETTINGS_UPDATED_EVENT).catch(() => {});
});
};
if (type === "model") {
@ -166,7 +170,7 @@ export function SettingsTabs({ type }: SettingsTabsProps) {
<div style={{ padding: "22px 20px", borderRadius: 14, background: "#000", color: "#fff" }}>
<div style={{ display: "flex", alignItems: "center", gap: 10, marginBottom: 14 }}>
<Crown size={16} strokeWidth={2.2} />
<span style={{ fontWeight: 700, fontSize: 14, letterSpacing: "-0.02em" }}>Подписка TalkFlow</span>
<span style={{ fontWeight: 700, fontSize: 14, letterSpacing: "-0.02em" }}>Подписка Talkis</span>
</div>
<ul style={{ listStyle: "none", padding: 0, margin: "0 0 14px", fontSize: 12, lineHeight: 2, opacity: 0.85 }}>
@ -240,7 +244,7 @@ export function SettingsTabs({ type }: SettingsTabsProps) {
/>
</div>
<div style={{ fontSize: 12, color: "var(--text-low)", lineHeight: 1.6 }}>
Ключ используется для Whisper (распознавание) и GPT-4o mini (обработка) и не отправляется на сервер Talk Flow.
Ключ используется для Whisper (распознавание) и GPT-4o mini (обработка) и не отправляется на сервер Talkis.
</div>
</div>
)}
@ -251,7 +255,7 @@ export function SettingsTabs({ type }: SettingsTabsProps) {
<div className="card" style={{ padding: 18, background: "rgba(255,255,255,0.58)" }}>
<div style={{ fontSize: 12, color: "var(--text-mid)", lineHeight: 1.65 }}>
{hasActiveSubscription ? (
<>Все запросы обрабатываются через серверы TalkFlow без ограничений.</>
<>Все запросы обрабатываются через серверы Talkis без ограничений.</>
) : settings.useOwnKey ? (
<>
Ключ можно получить на <span style={{ color: "var(--text-hi)", fontWeight: 600 }}>platform.openai.com</span> в разделе API Keys.