mirror of
https://github.com/SerTimBerrners-Lee/talkis.git
synced 2026-07-09 17:29:15 +00:00
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:
parent
ef4d18dc38
commit
71ae9ba28a
35 changed files with 174 additions and 100 deletions
|
|
@ -1,2 +1,2 @@
|
|||
# TalkFlow environment variables
|
||||
# Talkis environment variables
|
||||
# Copy this file to .env and add your API keys
|
||||
8
.github/workflows/release.yml
vendored
8
.github/workflows/release.yml
vendored
|
|
@ -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 }}
|
||||
|
||||
|
|
|
|||
26
AGENTS.md
26
AGENTS.md
|
|
@ -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)
|
||||
|
|
|
|||
34
README.md
34
README.md
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
70
docs/release/review-v0.1.8.md
Normal file
70
docs/release/review-v0.1.8.md
Normal 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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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
4
src-tauri/Cargo.lock
generated
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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")]
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
fn main() {
|
||||
talk_flow_lib::run()
|
||||
talkis_lib::run()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 применяет доступ не мгновенно. После изменения настройки вернитесь в приложение."}
|
||||
|
|
|
|||
|
|
@ -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 }} />
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue