Commit Graph

1346 Commits

Author SHA1 Message Date
DIYgod 5aba30eb4f fix(desktop): derive MAS review state from OTA versions 2026-04-15 15:57:51 +08:00
DIYgod acfb054bdc fix(desktop): ignore stale cached renderer bundles 2026-04-15 10:10:00 +08:00
DIYgod bfbce383a2
release(desktop): Release v1.6.0 (#4970)
* docs(mobile): prepare release changelog

* release(mobile): release v0.4.1

* fix(ssr): route dist-external assets (#4956)

* fix(cli): close login callback sockets (#4957)

* fix(ci): sync release branches to dev via pull request

* fix(mobile): increase ai summary font size

* fix(desktop): improve pdf export layout and branding

* fix(mobile): refresh social login state

* fix: correct French translation language detection

* build(deps): bump android-actions/setup-android from 3 to 4 (#4929)

Bumps [android-actions/setup-android](https://github.com/android-actions/setup-android) from 3 to 4.
- [Release notes](https://github.com/android-actions/setup-android/releases)
- [Commits](https://github.com/android-actions/setup-android/compare/v3...v4)

---
updated-dependencies:
- dependency-name: android-actions/setup-android
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(ai-chat): show reset date for future credits

* feat: refine spotlight settings and highlighting

* feat: add spotlight settings across desktop and mobile

* build(deps): bump actions/github-script from 8 to 9 (#4961)

Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v8...v9)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '9'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump signpath/github-action-submit-signing-request (#4960)

Bumps [signpath/github-action-submit-signing-request](https://github.com/signpath/github-action-submit-signing-request) from 2.0 to 2.1.
- [Release notes](https://github.com/signpath/github-action-submit-signing-request/releases)
- [Commits](https://github.com/signpath/github-action-submit-signing-request/compare/v2.0...v2.1)

---
updated-dependencies:
- dependency-name: signpath/github-action-submit-signing-request
  dependency-version: '2.1'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(mobile): avoid YouTube embed error on iOS close #4958

* fix(mobile): patch fmt for Xcode 26.4 builds

* build(deps): bump pnpm/action-setup from 4 to 5 (#4922)

Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4 to 5.
- [Release notes](https://github.com/pnpm/action-setup/releases)
- [Commits](https://github.com/pnpm/action-setup/compare/v4...v5)

---
updated-dependencies:
- dependency-name: pnpm/action-setup
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(desktop): migrate tts to folo service

* docs(ota): add OTA service design spec

* feat(ota): scaffold Cloudflare worker app

* fix(ota): align scaffold with task spec

* fix(ota): use standard worker types

* fix(ota): tighten scaffold schema and dev config

* fix(ota): require at least one platform

* fix(ota): use dev env for local wrangler

* docs(ota): add implementation plan and release scoping

* chore(ota): update lockfile for worker deps

* feat(ota): add release selection primitives

* test(ota): cover incompatible newer release selection

* fix(ota): tighten release compatibility checks

* fix(ota): reject empty platform payloads

* feat(ota): add kv helpers and policy logic

* fix(ota): enforce min binary store policy

* feat(ota): fetch OTA releases from GitHub

* fix(ota): return GitHub release etags

* feat(ota): mirror release payloads into R2

* fix(ota): stream mirrored archive extraction

* fix(ota): verify mirrored asset hashes

* feat(ota): serve manifests assets and policy

* fix(ota): harden manifest and policy routes

* fix(ota): validate route semver inputs

* fix(ota): verify manifest pointer version

* feat(ota): add sync orchestration routes

* fix(ota): dedupe concurrent sync passes

* feat(mobile): enable OTA background updates

* fix(mobile): restore OTA provider typecheck

* feat(mobile): add streaming tts playback

* fix(mobile): align OTA provider state

* feat(mobile): add ota policy client and debug controls

* fix(mobile): harden ota policy and debug controls

* test(mobile): cover ota provider helpers

* ci(desktop): automate Mac App Store pkg upload

* feat(ota): generate release assets from mobile export

* test(mobile): fix ota provider test typing

* test(mobile): discover ota script test via explicit config

* fix: tighten OTA release asset metadata handling

* fix: require OTA platform asset arrays

* ci(ota): publish releases and trigger sync

* fix(ci): harden ota publish workflow

* ci(ota): tighten trailer validation

* docs(ota): add rollout and rollback runbook

* feat(mobile): upgrade expo sdk 55 and rnfirebase

* fix(ota): emit expo-compatible update identifiers

* fix(ota): support private GitHub release assets

* fix(mobile): unblock ios archive on expo sdk 55

* build(deps): bump pnpm/action-setup from 5 to 6 (#4962)

Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 5 to 6.
- [Release notes](https://github.com/pnpm/action-setup/releases)
- [Commits](https://github.com/pnpm/action-setup/compare/v5...v6)

---
updated-dependencies:
- dependency-name: pnpm/action-setup
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(ci): restore ota typing and tailwind config compatibility

* test(mobile): fix ota provider test typing

* chore(ota): persist production cloudflare bindings

* fix(ci): restore semver types and ota test mocks

* feat(release): drive mobile release mode from config files

* fix(ota): sign manifests and pin runtime version

* fix(ci): disable frozen lockfile for local eas builds

* docs(spec): add desktop ota unification design

* feat(ota): unify desktop updates with ota service

* fix(ota): harden desktop sync and updater flow

* docs(skill): update desktop release workflow

* fix(release): repair ota and desktop update flows

* feat: cache storefront versions for ota policy

* feat: expose ota version badges

* feat: expose ota version badges

* fix: backfill github version badges

* fix: backfill github version badges

* docs(skills): align release modes with implementation

* fix: update Discord invite link in README.md

* fix: update macOS and Windows app store links in README.md

* fix: update GitHub badge labels in README.md

* build(deps): bump actions/download-artifact from 5 to 8 (#4969)

Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v5...v8)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump softprops/action-gh-release from 2 to 3 (#4968)

Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* docs(release): prepare desktop and mobile release metadata

* release(desktop): release v1.6.0

* fix(desktop): restore spotlight settings sync

* fix(desktop): apply spotlight highlights in entry rendering

* fix(desktop): extend spotlight highlight coverage

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-14 12:49:15 +08:00
Cocoon-Break b469f07029
fix: use >= for hour-format threshold in PlayerProgress (Closes #4965) (#4966)
Signed-off-by: Cocoon-Break <54054995+kuishou68@users.noreply.github.com>
2026-04-13 15:13:37 +08:00
DIYgod aea74f80a7 chore(sync): merge main into dev
# Conflicts:
#	apps/desktop/layer/renderer/src/modules/settings/tabs/integration/index.tsx
2026-04-03 13:28:15 +08:00
DIYgod 421d50fca8 fix(desktop): restore integration typecheck 2026-04-03 13:15:59 +08:00
wait 20cc43cf16 fix: resolve Obsidian EPERM on macOS by using native folder picker (#4242) (#4924)
- Replace text input with native dialog.showOpenDialog for vault path selection
- Add path validity detection with three-state UI (unselected/valid/invalid)
- Fix YAML frontmatter parsing failure with Chinese/special characters
- Fix ENOENT error when vault subdirectory doesn't exist
- Add AI summary (description) to Obsidian frontmatter export
- Add author fallback to feed title when entry author is empty
- Increase filename truncation limit from 20 to 80 characters for CJK titles

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 12:41:59 +08:00
DIYgod b7ccf7b872 fix(desktop): repair auth and cli sync 2026-04-03 12:38:01 +08:00
DIYgod 4cb761a501 fix(desktop): persist two-factor challenge cookies 2026-04-03 11:24:49 +08:00
DIYgod 43b5052b06 fix(desktop): persist session token after 2fa 2026-04-02 22:19:36 +08:00
DIYgod 69bed891a3 fix(desktop): add explicit 2fa submit 2026-04-02 22:16:26 +08:00
DIYgod 0508144f8d fix(desktop): use one-time token in cli settings 2026-04-02 21:11:58 +08:00
DIYgod 8b3a1b8965 fix(desktop): use one-time token for cli sync 2026-04-02 21:02:46 +08:00
wait bd879d5f9e
fix: resolve Obsidian EPERM on macOS by using native folder picker (#4242) (#4924)
- Replace text input with native dialog.showOpenDialog for vault path selection
- Add path validity detection with three-state UI (unselected/valid/invalid)
- Fix YAML frontmatter parsing failure with Chinese/special characters
- Fix ENOENT error when vault subdirectory doesn't exist
- Add AI summary (description) to Obsidian frontmatter export
- Add author fallback to feed title when entry author is empty
- Increase filename truncation limit from 20 to 80 characters for CJK titles

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 20:57:21 +08:00
DIYgod c799152a1e fix(desktop): repair cli settings sync 2026-04-02 19:43:05 +08:00
DIYgod 1571396fb6
fix: upgrade sdk packages and align app types (#4950) 2026-04-02 09:03:57 +00:00
DIYgod 03ccfa8c56
fix: keep hovered unread entries visible (#4948) 2026-04-02 07:28:30 +00:00
DIYgod ce5e91962c
fix: pause scroll mark read after refresh (#4946) 2026-04-02 07:21:57 +00:00
DIYgod a9eaae8c88
fix(desktop): export pdf via electron ipc (#4943) 2026-04-02 12:37:03 +08:00
DIYgod 14c77295ac fix(desktop): keep ai chat input within viewport 2026-03-24 13:04:48 +08:00
DIYgod 99081f8e7f fix(desktop): support two-factor auth in electron 2026-03-24 13:03:18 +08:00
DIYgod 2c1c978b0e fix(desktop): add auth origin headers for electron 2026-03-24 11:49:39 +08:00
DIYgod 338164b68c fix(web): remove openpanel and fix ssr manifest 2026-03-17 18:17:39 +08:00
DIYgod b5ab3e08b6 feat(cloudflare): split desktop and ssr workers 2026-03-17 16:51:45 +08:00
DIYgod fa7ce0f011 fix(cli): use npx latest and restore login flow 2026-03-17 12:18:24 +08:00
DIYgod 9a8280ded4 feat(cli): switch desktop sync to folocli 2026-03-17 11:18:48 +08:00
DIYgod 3f31f505f8 fix: restore frontend ci for better-auth upgrade 2026-03-16 21:35:14 +08:00
DIYgod 397049014f fix: upgrade better-auth client compatibility 2026-03-16 21:14:41 +08:00
John Li b55e2f0eb7
fix(electron): persist theme settings (#4900) 2026-03-16 17:18:52 +08:00
DIYgod aea75fe57b fix(desktop): improve self-test coverage and ui polish 2026-03-13 10:20:01 +08:00
DIYgod 96b6eac16a fix(desktop): hide cli settings tab for release 2026-03-12 20:37:07 +08:00
DIYgod 94f90873d5 fix(desktop): restore renderer api requests 2026-03-12 20:35:26 +08:00
DIYgod 565793fceb
feat: support iOS Apple subscriptions (#4910)
* feat(mobile): support iOS Apple subscriptions

* fix: stabilize mobile subscription checks
2026-03-12 09:41:55 +08:00
DIYgod b1ed3828d4
feat: add store review prompts for desktop and mobile (#4909) 2026-03-11 22:54:04 +08:00
DIYgod e00e043d6c fix(desktop): remove text selection toolbar 2026-03-11 16:56:39 +08:00
DIYgod c9eac7812c
fix: harden desktop e2e auth and user flows (#4904)
* fix: harden desktop e2e auth and user flows

* fix: stabilize desktop e2e in ci

* fix: stabilize ci desktop e2e flows

* fix: make ci desktop e2e more robust

* fix: avoid media interception in desktop e2e

* fix: increase desktop e2e timeouts for ci

* fix: use keyboard navigation for web e2e entries

* fix: stabilize desktop e2e navigation in ci

* fix: simplify desktop e2e navigation paths

* fix: narrow desktop e2e action selectors

* fix: add desktop e2e read-action fallbacks

* fix: reduce desktop e2e flakiness in ci

* fix: harden desktop e2e route transitions

* fix: relax desktop e2e ci assertions

* fix: prefer keyboard read toggle in desktop e2e

* fix: tolerate settings modal close races in e2e

* fix: tighten desktop e2e flows and remove gha e2e
2026-03-10 21:37:48 +08:00
DIYgod 93e4a3b48f
feat: add cross-platform e2e coverage (#4901)
* feat: add cross-platform e2e coverage

* fix: stabilize desktop e2e navigation

* fix: harden desktop e2e read flow

* fix: harden desktop e2e auth and follow flows

* fix: stabilize desktop e2e discover entry flows

* fix: run android e2e in a single shell

* fix: speed up mobile e2e builds in ci

* fix: build android e2e app from mobile workspace

* fix: invoke android gradle build from repo root

* fix: use absolute path for android ci build

* fix: restore android eas build in ci

* fix: target iOS simulator by udid in ci

* fix: align desktop e2e with discover card flow

* fix: reorder web e2e after relogin

* fix: navigate web e2e via real hash url

* fix: close stale settings modal before reopening

* fix: track android maestro flows

* fix: wait for settings router in web e2e

* fix: wait for web settings sync propagation

* fix: stabilize desktop e2e settings flows

* fix: harden desktop e2e regressions

* fix: stabilize desktop e2e selectors

* fix: read desktop entry state from locators

* fix: relax desktop e2e entry assertions

* fix: avoid waiting on missing desktop feed ids
2026-03-10 11:32:00 +08:00
DIYgod df748a5f6a
feat(cli): deep integration with desktop client (#4896)
* feat(cli): deep integration with desktop client

- Package CLI binary with desktop app via extraResource in Electron Forge
- Sync desktop login session to ~/.folo/config.json automatically on login/logout
- Add CliService IPC with install/uninstall methods supporting macOS (osascript), Linux (pkexec), Windows (.cmd wrapper)
- Add CLI settings tab in desktop app for install status and management
- Create prepare-cli build script to compile and bundle CLI before packaging
- Add i18n strings for CLI UI (English and Chinese)

The CLI now shares the desktop app's authentication session without requiring separate login.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* fix(cli): fix CI failures in auth service and forge config

- Pass `undefined` explicitly to syncSessionToCliConfig() to satisfy TS arity check
- Make resources/cli conditional in extraResource so packaging doesn't fail when CLI bundle is absent

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(cli): make syncSessionToCliConfig token param optional

Avoids TS2554 when called without arguments on signOut, while also
satisfying the lint rule that strips explicit `undefined` arguments.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(cli): address PR review feedback

- Fix $@ shell expansion in privileged install path by writing to a
  temp file first, then using admin cp (Comment #1)
- Check .cmd extension on Windows for install status and uninstall
  guard so the CLI is correctly detected and removed (Comment #2)
- Wire prepare:cli into build:electron-vite instead of build:electron
  so all CI packaging paths (vite + forge) include CLI (Comment #3)
- Add CLI i18n strings for ja, fr-FR, zh-TW locales (Comment #4)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-08 10:02:11 +08:00
DIYgod adca1960a6
fix(desktop): switch AI spline asset domain (#4875) 2026-02-24 15:47:22 +08:00
DIYgod 330ee9cd1a
fix: harden setting sync auth lifecycle (#4872)
* fix: harden setting sync auth lifecycle

* fix: preserve legacy setting sync queue

* fix: keep setting queue on auth flaps

* fix: persist queue reset on auth errors

* fix: initialize setting sync queue earlier

* fix: await mobile sync queue load
2026-02-24 12:24:20 +08:00
DIYgod b465ec1463
fix: harden external protocol handling and unblock dev:electron (#4863)
* fix(desktop): harden external protocol handling

* fix(build): avoid optional peer resolution in dev
2026-02-20 21:36:23 +08:00
DIYgod 8963930f29
fix(web): resolve ai onboarding typecheck regressions (#4862) 2026-02-19 16:59:10 +08:00
DIYgod d386c00ebd
fix: clean up renderer lint issues and refresh lockfile (#4860) 2026-02-19 16:38:40 +08:00
DIYgod b548f5a39c Merge remote-tracking branch 'origin/mobile-main' into release/mobile/0.3.0
# Conflicts:
#	apps/desktop/layer/main/src/updater/custom-github-provider.ts
#	apps/desktop/layer/renderer/src/modules/achievement/AchievementModalContent.tsx
#	apps/desktop/layer/renderer/src/modules/entry-column/EntrySubscriptionItem.tsx
#	apps/desktop/layer/renderer/src/modules/entry-column/components/EntryPlaneToolbar.tsx
#	apps/desktop/layer/renderer/src/modules/entry-column/components/EntrySubscriptionSkeleton.tsx
#	apps/desktop/layer/renderer/src/modules/entry-content/EntryContent.legacy.tsx
#	apps/desktop/layer/renderer/src/modules/new-user-guide/guide-modal-content.tsx
#	apps/desktop/layer/renderer/src/modules/settings/tabs/invitations.tsx
#	apps/desktop/layer/renderer/src/modules/settings/tabs/referral.tsx
#	apps/desktop/layer/renderer/src/modules/wallet/level.tsx
#	apps/mobile/src/modules/login/referral.tsx
#	apps/mobile/src/modules/settings/routes/Invitations.tsx
#	apps/mobile/src/modules/settings/routes/Referral.tsx
#	apps/mobile/src/screens/(modal)/InvitationScreen.tsx
2026-02-18 23:53:40 +08:00
DIYgod 0da9f2098e
feat: migrate desktop/mobile error tracking to posthog (#4858)
* feat: migrate desktop and mobile error tracking to PostHog

* fix(mobile): remove unsupported tab bar minimize API

* Revert "fix(mobile): remove unsupported tab bar minimize API"

This reverts commit e234dda51257dc6810f0f78e06ee918adf2214b0.
2026-02-18 23:16:00 +08:00
DIYgod 01da257c90
feat(i18n): merge #4597/#4774 and complete localization audit (#4839)
* chore: Update Japanese translations for new features and errors

Added and updated multiple Japanese locale strings across AI, app, errors, external, settings, and shortcuts modules. Changes include new labels, descriptions, error messages, and UI text for features such as scheduling, token usage, inbox management, toolbar customization, and quick search.

* Add Japanese README documentation

Introduces README-ja.md with comprehensive information about Folo, including features, installation instructions, community links, contribution guidelines, code signing policies, and license details for Japanese-speaking users.

* Update formatting in Japanese README

Corrected the admonition marker from '[!重要]' to '[!IMPORTANT]' for consistency and made minor formatting adjustments in the README-ja.md file.

* Update community section in Japanese README

Revised wording and formatting in the community participation section of README-ja.md for improved clarity and consistency.

* Remove Japanese README file

Deleted README-ja.md to reduce duplication or outdated documentation. All relevant information should now be referenced from the main README or other documentation files.

* feat: add French (fr-FR) localization

* fix: sort imports in default-resource.ts to resolve lint error

* feat: add missing French translations for mobile/default, native, and external locales

* feat: add French language filter to discovery/recommended feeds

* docs: update changelog for French localization

* feat(i18n): merge PR #4597/#4774 and finish localization audit

---------

Co-authored-by: dai <dosada@gmail.com>
Co-authored-by: Anthony Mahé <snpepito@gmail.com>
Co-authored-by: Anthony Mahé <104373430+AnthonyMahe@users.noreply.github.com>
2026-02-13 09:25:08 +00:00
DIYgod 0859f56ad4
chore: update workspace dependencies and lockfile (#4838)
* chore: update workspace dependencies

- bump dependencies across desktop, mobile, ssr, and internal packages

- refresh pnpm lockfile

- apply type compatibility fixes required by upgraded packages

* fix(ssr): prevent tsdown CI warning from failing build

- set inlineOnly to false in tsdown config

* style: format files for CI prettier check

- apply prettier formatting to files reported by format:check

* fix(mobile): downgrade reanimated for rn 0.79 ios build
2026-02-13 16:04:13 +08:00
DIYgod 2290ec7f3c
fix: preserve session when switching API domain (#4833)
* feat(auth): migrate session across API domain switch

* fix(auth): address PR review on migration flow

* fix(ci): avoid package.json mutation during renderer build
2026-02-12 20:58:03 +08:00
DIYgod 62efdd29b2
fix: handle invalid URL parsing in useFeedSafeUrl hook (#4823)
Wrap new URL() constructor in try-catch to gracefully handle malformed URL strings that start with 'http' but are invalid. Returns null instead of throwing.

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-30 13:48:23 +08:00
DIYgod c0ce04453f
refactor: remove checkNew timeline update detection logic (#4817)
Remove the checkNew query and related state management that periodically checked for new entries in the timeline. The hasUpdate state and related UI indication (refresh button highlighting) have been removed while preserving fetchedTime for mark-all-read filtering.
2026-01-21 13:31:54 +08:00