* 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
* 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>
* chore(infra): migrate desktop web from Vercel to Cloudflare Workers
Replaces separate Vercel deployments (follow SPA + follow-external-ssr) with unified Cloudflare Workers + Assets deployment. Implements meta tag injection, OG image generation, and environment variable management in Hono-based Worker. Adds GitHub Actions CI/CD for automatic deployment on push to dev/main branches.
- Replace Fastify with Hono for Cloudflare Workers compatibility
- Create Worker entry point with SSR routes and SPA fallback
- Add AsyncLocalStorage-based request context shim
- Implement WASM-based OG image rendering with R2 font storage
- Split SPA and SSR routing: /share/* and auth routes use SSR, others fallback to SPA
- Add Cloudflare wrangler configuration with dev/prod environments
- Create GitHub Actions workflow for automated deployments
- Add build scripts for font data and WASM patching
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(ssr): exclude worker files from typecheck and fix tsdown config
Worker-specific files (*.worker.ts) use Cloudflare Workers types and
generated modules that aren't available during the main tsc typecheck.
Exclude them from tsconfig since they're only used via tsdown aliases.
Also fix broken path.resolve reference in tsdown.worker.config.ts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Added `currentFeedTitle` prop to various entry components, including `EntryItemImpl`, `EntryVirtualListItem`, and `AllItem`, to improve context awareness in rendering.
- Integrated `useFeedHeaderTitle` hook in `EntryList` to fetch the current feed title dynamically.
- Updated related types and interfaces to accommodate the new prop, enhancing type safety and clarity.
These changes aim to provide a more contextual user experience when interacting with entry items in the application.
Signed-off-by: Innei <tukon479@gmail.com>
- Refactored WebViewManager to improve lifecycle management and state handling.
- Introduced a debug panel for monitoring WebView state and actions in development mode.
- Updated JavaScript injection methods to use a centralized dispatch system for better maintainability.
- Improved handling of local HTML loading and state replay after process termination.
- Added new functions for debugging, including state retrieval and flushing pending scripts.
This update aims to enhance the overall performance and usability of the WebView component, providing developers with better tools for debugging and state management.
Signed-off-by: Innei <tukon479@gmail.com>
Added entries for .claude/settings.local.json and PRPS/* to the .gitignore file to prevent local configuration and generated files from being tracked in the repository.
- Create AppX manifest generation script using template file
- Add support for multiple languages (EN, ZH-CN, ZH-TW, JA)
- Include protocol handlers for folo and follow schemes
- Add OPML file type association
- Update Electron Forge config to use custom manifest
- Add build:electron-forge:ms script for Microsoft Store builds
- Update GitHub Actions workflow to use custom build for store distribution
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Renamed the plugin from '@follow/vite-plugin-route-builder' to '@follow-app/vite-plugin-route-builder' for better clarity.
- Added support for synchronous loading of components with the new '.sync.tsx' file extension.
- Enhanced the route generation logic to accommodate custom segment group ordering.
- Updated package dependencies and configurations, including the addition of test scripts and improved documentation.
Signed-off-by: Innei <tukon479@gmail.com>
- Introduced a new plugin to generate React Router routes from a file system-based structure, enhancing routing capabilities similar to Next.js.
- Updated various configurations and components to integrate the new plugin, including automatic route generation during build time.
- Refactored existing router implementations to utilize generated routes, improving maintainability and performance.
Signed-off-by: Innei <i@innei.in>
Signed-off-by: Innei <tukon479@gmail.com>
* update
Signed-off-by: Innei <tukon479@gmail.com>
* chore: update Babel and Metro configurations
- Added `unstable_transformImportMeta` option to Babel preset for improved JSX handling.
- Disabled `unstable_enablePackageExports` in Metro configuration for better package resolution.
Signed-off-by: Innei <tukon479@gmail.com>
* chore: add react-native-ios-utilities patch and update dependencies
- Introduced a patch for `react-native-ios-utilities` to enhance functionality.
- Updated `expo`, `react-native`, and `react-native-reanimated` versions in the example app for improved compatibility.
- Added `react-native-ios-utilities` to the project dependencies in `package.json`.
Signed-off-by: Innei <tukon479@gmail.com>
* update
Signed-off-by: Innei <tukon479@gmail.com>
* chore: auto-fix linting and formatting issues
* refactor: improve route parameter handling and entry fetching logic
- Updated `useRouteParams` to utilize `useReadonlyRoute` for better state management.
- Enhanced `useEntriesByView` to separate remote and local entry fetching, improving data handling and error management.
- Introduced debouncing for pagination in local entries and added toast notifications for error handling.
- Cleaned up entry ID retrieval to ensure uniqueness and prevent duplicates.
Signed-off-by: Innei <tukon479@gmail.com>
* refactor: simplify Masonry component return statement
- Updated the return statement in the Masonry component to use JSX syntax for better readability and consistency.
Signed-off-by: Innei <tukon479@gmail.com>
* refactor: update import from RootPortalProvider to RootPortalContext
- Changed the import statement in Sheet.tsx to reflect the updated context provider name for better clarity and consistency in the codebase.
Signed-off-by: Innei <tukon479@gmail.com>
* update
Signed-off-by: Innei <tukon479@gmail.com>
* refactor: update ref types in component props
- Changed ref prop types from React.RefObject to React.Ref for better type compatibility across various components, enhancing overall code consistency and maintainability.
Signed-off-by: Innei <tukon479@gmail.com>
* feat: add Xcode build server configuration and enhance desktop app routing
- Introduced a new configuration file for the Xcode build server to streamline iOS builds.
- Updated Vite configuration to include a new proxy route for sharing functionality.
- Added a new Jotai atom for managing preview state in the application.
- Removed deprecated error fallback component to clean up the codebase.
- Implemented a new render style hook for consistent styling across components.
- Enhanced entry column components with improved error handling and layout adjustments.
- Updated various components to utilize the new render style and improved accessibility.
Signed-off-by: Innei <tukon479@gmail.com>
* update
Signed-off-by: Innei <tukon479@gmail.com>
* fix: ensure plugins array is initialized and update TypeScript configuration
- Initialized the plugins array in the mobile app configuration to prevent potential runtime errors.
- Updated TypeScript configuration to enhance module resolution and improve code organization with clearer path definitions.
Signed-off-by: Innei <tukon479@gmail.com>
* update lint
Signed-off-by: Innei <tukon479@gmail.com>
* refactor: update TypeScript types and improve component props
- Added `skipLibCheck` to TypeScript configuration for faster builds.
- Updated prop types in various components to allow for null values in refs, enhancing type safety.
- Refactored several components to ensure better type compatibility and maintainability.
Signed-off-by: Innei <tukon479@gmail.com>
* refactor(mobile): improve layout handling in NavigationHeader component
- Added console logs for debugging right and left widths.
- Adjusted layout structure to ensure proper width handling for header elements.
- Updated loading indicator positioning and visibility logic.
Signed-off-by: Innei <tukon479@gmail.com>
* refactor(mobile): update Pager and QRCode components to use forwardRef
- Refactored Pager and QRCode components to directly export as functional components with forwardRef.
- Updated type definitions to improve ref handling and ensure better type safety.
- Simplified component structure for improved readability and maintainability.
Signed-off-by: Innei <tukon479@gmail.com>
* refactor(ui): enhance FAB components with functional component structure and improved type definitions
- Converted FABBase and FABPortable to functional components using FC type for better type safety.
- Updated props to include optional ref handling, enhancing flexibility in usage.
- Simplified component structure for improved readability and maintainability.
Signed-off-by: Innei <tukon479@gmail.com>
* chore(deps): update react-native-ios-utilities patch and refine TypeScript configuration
- Updated the patch for react-native-ios-utilities in pnpm-lock.yaml to reflect a new hash.
- Enhanced TypeScript configuration in tsconfig.json by adding exclusion for node_modules and formatting paths for better readability.
- Cleaned up the react-native-ios-utilities.patch by removing unused exports from the index file.
Signed-off-by: Innei <tukon479@gmail.com>
* update
Signed-off-by: Innei <tukon479@gmail.com>
---------
Signed-off-by: Innei <tukon479@gmail.com>