Skip to content

Epic/103 create web app#487

Merged
felix-schultz merged 39 commits intodevfrom
epic/103-create-web-app
Feb 9, 2026
Merged

Epic/103 create web app#487
felix-schultz merged 39 commits intodevfrom
epic/103-create-web-app

Conversation

@felix-schultz
Copy link
Copy Markdown
Member

This pull request introduces several new AWS backend components, improves logging and error monitoring across backend services, and adds new dependencies and configuration files to support these changes. The most significant updates are the addition of the aws-event-bridge Lambda function, improved initialization and error tracking for Lambda-based services, and the inclusion of new workspace members and dependencies.

New AWS Backend Components:

  • Added the apps/backend/aws/event-bridge Lambda function, which listens for CloudWatch Events, extracts event details, and triggers an API endpoint to initiate sink operations. Includes a Dockerfile and full implementation of the handler (apps/backend/aws/event-bridge, apps/backend/aws/event-bridge/Dockerfile, apps/backend/aws/event-bridge/src/main.rs). [1] [2] [3] [4]
  • Added new workspace members for AWS Event Bridge, Kubernetes sink trigger, and Docker Compose sink services in Cargo.toml. [1] [2]

Logging, Tracing, and Error Monitoring Improvements:

  • Updated Lambda-based services (aws/api, aws/executor, aws/executor-async, aws/file-tracker, aws/media-transformer) to use tracing_subscriber with configurable log levels via environment variables, and integrated Sentry error monitoring where applicable. This reduces log noise and improves observability. [1] [2] [3] [4] [5] [6] [7] [8] [9]

Dependency and Configuration Updates:

  • Added new dependencies for AWS Lambda events, Copilot SDK, and other libraries to support new backend services and improve compatibility (e.g., pure Rust backend for flate2). [1] [2] [3]
  • Updated flow-like-api and flow-like-catalog features to enable Lambda and remote ML execution support in relevant services. [1] [2] [3]
  • Added a about.toml configuration file for cargo-about license management.

API and Coding Standards Documentation:

  • Introduced .github/instructions/api.instructions.md to document API security, OpenAPI specification requirements, and performance guidelines for Rust API endpoints.
  • Updated general coding instructions to encourage the use of subagents for parallelizable tasks.

AWS Executor Enhancements:

  • Improved the executor-async payload to support user_context and profile fields, and ensured the catalog runtime is properly initialized for ONNX and remote ML execution. [1] [2] [3] [4] [5]

These changes collectively enhance the backend's modularity, observability, and maintainability, while laying groundwork for new event-driven workflows and improved operational practices.

feat: enhance BitFromStringNode to handle "hub:id" format for bit_id

fix: harmonize value types in SelectNode for better type consistency

refactor: consolidate tool results into a single User message in A2UICopilot

fix: improve CopyPasteCommand to handle variable references correctly

fix: update MoveNodeCommand to retain original coordinates for input/return nodes

refactor: streamline tool results handling in FlowCopilot

feat: add variable handling in CopyPasteCommand for better variable management

fix: ensure FlowNode updates coordinates correctly during move operations

feat: enhance FlowPreview to accept comments and layers for better rendering

refactor: optimize FlowTemplateSelector to prioritize diverse templates

fix: update DeviceFlowDialog to use merged scopes for OAuth

fix: improve TemplatePreview to render comments and layers correctly

feat: extend ICopyPaste interface to include original_variables for copy-paste operations

feat: add getProfileBits method to IBitState for better bit management

feat: implement getProfileBits in EmptyBitState for consistency
…webhook support

- Added remote webhook setup for Discord, including public key input and instructions.
- Updated HTTP configuration to support local and remote endpoint URLs with tabs.
- Implemented webhook management for Telegram, including status checks and setup instructions.
- Introduced dynamic sink availability checks based on hub configuration for translation events.
- Enhanced interfaces to include hub and eventId for better context in configurations.
- Implemented `useMediaUpload` hook for handling media uploads (images and videos) with progress tracking and placeholder nodes.
- Updated flow board parsing to differentiate between media and text comments.
- Added new API key state management for handling technical users and API keys.
- Introduced sales state management for app sales, discounts, and analytics.
- Created a tool for generating scoped sink trigger JWTs for various services.
- Updated package dependencies and added new libraries for enhanced functionality.
- Created a new section for AI Models & Setup, detailing supported providers and configuration steps.
- Added an overview of GenAI capabilities, including application types and core concepts.
- Introduced a comprehensive guide on Retrieval-Augmented Generation (RAG) for document-based AI responses.
- Developed a detailed overview of building internal tools using the A2UI system, covering components, data binding, and best practices.
…onent

- Added pricing pages for Korean, Dutch, Portuguese, Swedish, and Chinese.
- Updated the main pricing page to include English version.
- Replaced BlogHeader component with Header component in multiple index pages.
- Adjusted hero section styling for better layout.
- Enhanced AWS and GCP credentials handling by renaming log prefix to runs prefix.
- Updated API routes to support new execution backend configurations.
- Introduced SSE streaming support for Lambda SDK in invoke_board.
- Added ONNX Runtime initialization functionality in catalog.
- Updated MinIO setup script to reflect changes in log paths.
…d OCR types

- Implement tests for audio data creation, mono/stereo conversion, and resampling.
- Add serialization tests for speech segments, transcription segments, and VAD results.
- Create tests for depth map functionality and depth provider serialization.
- Include tests for face embedding cosine similarity and Euclidean distance calculations.
- Add serialization tests for detected faces and landmark types.
- Implement OCR region and recognized text serialization tests.
- Verify node metadata for various ONNX nodes ensuring execution pins and descriptions are present.
- Simplified conditional checks using `&&` in multiple locations to reduce nesting and improve clarity.
- Updated various functions across the codebase to enhance performance and maintainability.
- Removed unnecessary variable assignments and streamlined logic in several areas.
- Cleaned up imports and unused code to adhere to best practices.
- Removed unused imports and organized existing ones in `technical-user-management.tsx`, `shortcuts.tsx`, and `share-button.tsx`.
- Improved code readability by formatting and restructuring JSX elements in `technical-user-management.tsx`, `spotlight-dialog.tsx`, `empty-state.tsx`, `flow-background.tsx`, `loading-screen.tsx`, `not-found-page.tsx`, and `sheet.tsx`.
- Enhanced consistency in function definitions and hooks in `use-copilot-sdk.tsx`, `use-media-upload.ts`, and `flowpilot-db.ts`.
- Updated CSS animations and styles for better performance and clarity in `global.css`.
- Added type annotations and improved type safety in various files, including `download-manager.ts` and `gen-sink-jwt.ts`.
- Ensured consistent formatting and spacing throughout the codebase for improved maintainability.
…ages

- Implemented a new script `generate-licenses.ts` to collect and generate licenses for Rust and npm packages.
- The script scans specified package.json files and the Cargo registry for license information.
- Outputs individual license files for Rust and npm, as well as a combined license file.
- Includes functionality to read license texts from files and deduplicate entries.
- Provides summary statistics on the collected licenses.
- Introduced `use-peer-users` hook for managing peer user information with caching and color assignment based on user `sub`.
- Updated `FlowLayerIndicators` to utilize peer user info for displaying names, colors, and avatars.
- Modified `FlowNode` and `FlowWrapper` components to support user `sub` for real-time collaboration.
- Refactored `useRealtimeCollaboration` to streamline user state management and awareness updates.
- Added schema versioning to nodes for migration purposes across various commands and interfaces.
- Improved UI components for better user experience and responsiveness.
…nd models

- Added `ToSchema` derive macro to various structs in user-related routes (create_pat, delete_pat, get_pats, pricing, subscribe, templates, upsert_info, widgets) for OpenAPI schema generation.
- Defined OpenAPI paths for user routes including request bodies and responses.
- Updated Cargo.toml to include `utoipa` as an optional dependency and added relevant features for OpenAPI support.
- Refactored user shortcuts component to support drag-and-drop reordering with DnD Kit.
- Updated data lake and ONNX packages to improve functionality and compatibility with new features.
- Adjusted various structs in core and wasm packages to include OpenAPI schema generation.
- Added OpenAPI path annotations for `GET /apps/{app_id}/widgets` to list widgets with localization support.
- Added OpenAPI path annotations for `PUT /apps/{app_id}/widgets/{widget_id}` to create or update widgets.

feat(profile): enhance profile image handling and upload URL generation

- Implemented `generate_upload_url` and `delete_old_image` functions for managing profile images.
- Updated profile routes to utilize new image handling functions.
- Improved error handling and logging for profile image operations.

fix(profile): correct profile ID usage in profile routes

- Fixed incorrect usage of profile ID in `get_profiles`, `sync_profiles`, and `upsert_profile` routes.

feat(sink): add profile JSON to sink configuration

- Added `profile_json` field to `SinkConfig` to store the last updater's profile for trigger execution.
- Updated sync logic to handle the new profile JSON field.

feat(executor): support user profiles in execution requests

- Added `profile` field to `ExecutionRequest` to allow passing user profiles during execution.

fix(ui): improve model catalog filtering based on hosting capabilities

- Updated model filtering logic in `FlowPilot` and `AIModelPage` to exclude local models when hosting is not supported.

refactor(ui): enhance model catalog page layout

- Refactored layout of the model catalog page to improve mobile responsiveness and usability.
- Introduced a new mobile filter sheet for better accessibility on smaller screens.

fix(board): refine pin matching logic for generic value types

- Improved logic in `findMatchingPin` and `connectLayerToDroppedPin` to handle generic value type enforcement correctly.
…d enhance TypeScript configuration

- Added custom styles for maplibre popups to improve UI consistency.
- Upgraded `lucide-react` to version 0.563.0 and added `maplibre-gl` dependency at version 5.17.0.
- Enhanced `ExecutionServiceProvider` to fetch board state when not remote, falling back to prerun variables on failure.
- Introduced a new Tailwind CSS configuration file for better styling management.
- Updated TypeScript configuration to include base URL and path mappings for cleaner imports.
- Updated category strings in various A2UI elements to use "UI" instead of "A2UI" for better clarity and uniformity across the codebase.
- Adjusted the WriteCsvToTable node to support both CSV text and Table data, enhancing its functionality.
- Improved the GeoMap component by refining the viewport handling and updating styles for better visual presentation.
- Added support for setting the viewport in GeoMap components across various parts of the application.
- Implemented `update_schemas.rs` to define input schemas for various A2UI elements including GeoMap, Model3D, Scene3D, Sprite, Chart styles, Labeler Box, Hotspot, Table, and Media Sources.
- Created `update_sprite.rs` to manage sprite properties such as source, position, and transform.
- Developed `update_table.rs` to handle table operations including setting data, columns, adding/removing rows, and updating cells.
- Removed the deprecated `update_table_cell.rs` in favor of the unified table update node.
- Introduced `update_toggle.rs` to manage checkbox and switch states with operations to set, toggle, and get the checked state.
- Introduced `EmbeddingUsageTracking` entity for tracking embedding usage statistics.
- Updated `User` model to include `total_embedding_price` and related relations.
- Implemented new routes for embedding operations, including `/embeddings/embed`.
- Added support for remote embedding execution via API proxy in the embedding factory.
- Enhanced existing embedding models to support remote execution configurations.
- Updated API calls to handle embedding requests and responses, including error handling.
- Improved caching mechanisms for embedding models and secrets.
- Updated entity documentation to indicate generation by sea-orm-codegen.
- Changed `PartialEq` to `Eq` in entity model derives for stricter equality checks.
- Removed unnecessary comments and improved code readability across multiple entities.
- Adjusted field types and attributes for better alignment with database schema.
- Added new enums for `DiscountType`, `NotificationType`, and `PurchaseStatus`.
- Enhanced relationships in the `user` entity to include new associations.
- Refined JSON handling in entities to use `JsonBinary` where applicable.
- Ensured all entities have consistent field naming conventions and types.
…lity directly into RolesPage

- Deleted RoleFilters component to simplify role management UI.
- Integrated search input directly into RolesPage for better user experience.
- Updated filtering logic to handle roles based on search term.
- Removed unused sorting and tagging functionalities for clarity.
- Adjusted layout and styling for improved visual consistency.

fix: update RolePermissions to include new permissions and deprecate old ones

- Added new permissions for events and courses.
- Deprecated old permissions related to releases.
- Ensured RolePermissions class remains in sync with backend definitions.

feat: enhance event execution handling with alwaysRemote flag

- Introduced alwaysRemote flag in IEventState to manage remote execution of events.
- Updated ExecutionServiceProvider to utilize alwaysRemote for determining execution context.
- Improved handling of secrets based on execution context.

style: improve text editor overflow handling

- Added overflow handling styles to TextEditorStatic for better content display.
- Introduced OnlineProfile type and conversion function toLocalProfile for managing user profiles.
- Implemented getDefaultApiBase function to retrieve API base URL.
- Refactored AWS, Azure, GCP, and R2 credentials to use new HTTPClient initialization method without refetch.
- Enhanced bit and board routes to utilize the new HTTPClient method.
- Added TDMS data handling capabilities, including BatchInsertTdmsLocalDatabaseNode for inserting TDMS data into a vector database.
- Created TdmsMetadataNode for extracting metadata from TDMS files.
- Updated execution service context to improve handling of remote execution scenarios.
- Improved error handling and logging for TDMS processing.
- Added optional dependencies for TDMS and tempfile in Cargo.toml.
…mespace

feat: add optional _force parameter to getEvents method in EmptyEventState

refactor: update IEventState interface to include optional force parameter in getEvents method
- Implemented new usage tracking routes for LLM, embedding, and execution usage history.
- Added pagination support for usage history retrieval.
- Created a summary endpoint for aggregated usage data.
- Introduced new data models and interfaces for usage records.
- Updated frontend components to handle usage tracking data.
- Refactored global styles and layout for improved responsiveness.
- Enhanced error handling in storage operations.
- Cleaned up redundant code in storage component.
@felix-schultz felix-schultz linked an issue Feb 9, 2026 that may be closed by this pull request
@felix-schultz
Copy link
Copy Markdown
Member Author

@gemini-code-assist review

@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @felix-schultz, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly expands the platform's event-driven capabilities by introducing new AWS Lambda and Docker Compose services for event bridging and sink management. It also enhances the robustness and observability of existing backend services through improved logging and error monitoring. Concurrently, the desktop application receives major updates, including new administrative features, detailed board statistics, and a more resilient profile synchronization mechanism. These changes collectively lay a stronger foundation for modular, observable, and maintainable event-driven workflows across both cloud and desktop environments.

Highlights

  • New AWS Backend Components: Introduced the aws-event-bridge Lambda function for processing CloudWatch Events and triggering API endpoints. New workspace members for AWS Event Bridge, Kubernetes sink trigger, and Docker Compose sink services were added.
  • Enhanced Logging and Error Monitoring: Updated Lambda-based services (aws/api, aws/executor, aws/executor-async, aws/file-tracker, aws/media-transformer) to use tracing_subscriber with configurable log levels and integrated Sentry for improved observability and reduced log noise.
  • Dependency and Configuration Updates: Added new dependencies such as aws_lambda_events and copilot-sdk. The flate2 library was configured to use a pure Rust backend for iOS compatibility, and a new about.toml file was added for license management.
  • API and Coding Standards Documentation: New documentation (api.instructions.md) was added for API security, OpenAPI specifications, and performance guidelines. General coding instructions were updated to encourage the use of subagents for parallelizable tasks.
  • AWS Executor Enhancements: The executor-async payload now supports user_context and profile fields, and the catalog runtime is properly initialized for ONNX and remote ML execution in both aws/executor and aws/executor-async.
  • Desktop Application Features: Added new admin pages for managing sinks and viewing board statistics. Implemented robust profile synchronization with the backend, improved deep linking, and introduced native Discord and Telegram bot support as event sinks.
  • Kubernetes and Docker Compose Deployment Updates: New Helm charts and Docker Compose services were added to support the web application and event sink services, including a lean Kubernetes sink trigger for CronJobs and RBAC rules for API management of these resources.
Changelog
  • .github/instructions/api.instructions.md
    • Added new documentation for API security, OpenAPI specification, and performance guidelines for Rust API endpoints.
  • .github/instructions/general-coding.instructions.md
    • Updated to include a new section on 'Subagents' for parallelizable tasks.
  • Cargo.toml
    • Added new workspace members: apps/backend/aws/event-bridge, apps/backend/kubernetes/sink-trigger, apps/backend/docker-compose/sink-services, and packages/sinks.
    • Added new dependencies: aws_lambda_events and copilot-sdk.
    • Updated markitdown git revision.
    • Forced flate2 to use a pure Rust backend for iOS compatibility.
  • about.toml
    • Added a new configuration file for cargo-about license management, defining accepted licenses and workarounds for specific crates.
  • apps/backend/aws/api/Cargo.toml
    • Updated flow-like-api features to include 'lambda'.
  • apps/backend/aws/api/src/main.rs
    • Modified logging initialization to use tracing_subscriber::registry with EnvFilter for configurable log levels and Sentry integration.
  • apps/backend/aws/event-bridge/Dockerfile
    • Added a new Dockerfile for the aws-event-bridge Lambda function, including build and runtime stages.
  • apps/backend/aws/event-bridge/src/main.rs
    • Added a new Rust source file implementing the aws-event-bridge Lambda function, which processes CloudWatch Events and triggers an API endpoint.
  • apps/backend/aws/executor-async/Cargo.toml
    • Added flow-like-catalog with 'execute' and 'remote-ml' features.
    • Added tracing-subscriber, sentry, and sentry-tracing dependencies.
  • apps/backend/aws/executor-async/src/execution.rs
    • Modified DispatchPayload to include user_context and profile fields.
    • Updated execute function to pass user_context and profile to the ExecutionRequest.
  • apps/backend/aws/executor-async/src/main.rs
    • Modified logging initialization to use tracing_subscriber::registry with EnvFilter for configurable log levels and Sentry integration.
    • Added initialize_catalog() call for ONNX and remote ML execution.
  • apps/backend/aws/executor/Cargo.toml
    • Added flow-like-catalog with 'execute' and 'remote-ml' features.
  • apps/backend/aws/executor/src/main.rs
    • Modified logging initialization to use tracing_subscriber::registry with EnvFilter for configurable log levels and Sentry integration.
    • Added initialize_catalog() call for ONNX and remote ML execution.
  • apps/backend/aws/file-tracker/src/main.rs
    • Modified logging initialization to use tracing_subscriber::registry with EnvFilter.
  • apps/backend/aws/media-transformer/src/main.rs
    • Modified logging initialization to use tracing_subscriber::registry with EnvFilter.
  • apps/backend/aws/runtime-async/Cargo.toml
    • Renamed to apps/backend/aws/event-bridge/Cargo.toml.
    • Changed aws_lambda_events feature from 'sqs' to 'cloudwatch_events'.
    • Removed flow-like and flow-like-executor dependencies.
    • Updated lambda_runtime version.
    • Added reqwest dependency.
  • apps/backend/aws/runtime-async/README.md
    • Removed the README file for the old aws-runtime-async package.
  • apps/backend/aws/runtime-async/src/execution.rs
    • Removed the execution.rs file for the old aws-runtime-async package.
  • apps/backend/docker-compose/.env.example
    • Added new environment variables for web application configuration (WEB_PORT, NEXT_PUBLIC_API_URL, NEXT_PUBLIC_REDIRECT_URL, NEXT_PUBLIC_REDIRECT_LOGOUT_URL).
  • apps/backend/docker-compose/README.md
    • Updated the table of services to include web and sink-services.
    • Added a new section 'Supported Event Sinks' detailing various sink types and their requirements.
  • apps/backend/docker-compose/docker-compose.yml
    • Added new sink-services and web services with their respective build contexts, dependencies, environment variables, volumes, ports, and health checks.
  • apps/backend/docker-compose/flow-like.config.example.json
    • Added a new example configuration file for flow-like.config.json, including authentication, features, and supported sinks.
  • apps/backend/docker-compose/runtime/Cargo.toml
    • Added flow-like-catalog with 'execute' and 'local-ml' features.
  • apps/backend/docker-compose/runtime/src/main.rs
    • Added initialize_catalog() call for ONNX execution providers.
    • Modified process_queued_job to include user_context and profile in the ExecutionRequest.
  • apps/backend/docker-compose/sink-services/Cargo.toml
    • Added a new Cargo.toml for docker-compose-sink-services, including dependencies for cron scheduling, HTTP requests, Redis, and optional Discord/Telegram bot features.
  • apps/backend/docker-compose/sink-services/Dockerfile
    • Added a new Dockerfile for docker-compose-sink-services, including build and runtime stages.
  • apps/backend/docker-compose/sink-services/src/api_client.rs
    • Added a new Rust source file defining an ApiClient for interacting with the Flow-Like API, including methods for triggering events, getting cron schedules, and bot configurations.
  • apps/backend/docker-compose/sink-services/src/cron.rs
    • Added a new Rust source file implementing a CronScheduler that syncs schedules from the API and triggers events.
  • apps/backend/docker-compose/sink-services/src/discord.rs
    • Added a new Rust source file implementing a DiscordBotManager for managing multiple Discord bot instances, syncing configurations from the API, and handling messages.
  • apps/backend/docker-compose/sink-services/src/main.rs
    • Added a new Rust source file for the main sink-services application, loading configuration, connecting to Redis, and spawning tasks for cron, Discord, and Telegram sinks.
  • apps/backend/docker-compose/sink-services/src/storage.rs
    • Added a new Rust source file defining RedisStorage for persisting sink service state, including cron schedules and bot states.
  • apps/backend/docker-compose/sink-services/src/telegram.rs
    • Added a new Rust source file implementing a TelegramBotManager for managing multiple Telegram bot instances, syncing configurations from the API, and handling messages.
  • apps/backend/kubernetes/README.md
    • Updated the table of components to include Web deployment.
    • Updated local setup instructions to include port-forwarding for the Web App.
  • apps/backend/kubernetes/executor/Cargo.toml
    • Updated flow-like-catalog features to include 'local-ml'.
  • apps/backend/kubernetes/executor/src/main.rs
    • Added initialize_catalog() call for ONNX execution providers.
  • apps/backend/kubernetes/helm/templates/_helpers.tpl
    • Added new Helm template definitions for flow-like.web.labels and flow-like.web.selectorLabels.
  • apps/backend/kubernetes/helm/templates/ingress.yaml
    • Modified ingress rules to support routing to the new web service based on the service parameter.
  • apps/backend/kubernetes/helm/templates/sink-cronjob.yaml
    • Added a new Helm template documenting the structure of CronJobs created by the API's Kubernetes controller for cron-based event sinks.
    • Added RBAC rules for the API to manage CronJobs.
  • apps/backend/kubernetes/helm/templates/sink-secrets.yaml
    • Added a new Helm template for sink-secrets and sink-config to store JWT and API base URL for sink triggers.
  • apps/backend/kubernetes/helm/templates/sink-trigger-image.yaml
    • Added a new Helm template documenting the build and usage of the sink-trigger container image.
  • apps/backend/kubernetes/helm/templates/web-deployment.yaml
    • Added a new Helm template for the web application deployment, including image, ports, probes, resources, and security context.
  • apps/backend/kubernetes/helm/templates/web-hpa.yaml
    • Added a new Helm template for Horizontal Pod Autoscaler for the web application.
  • apps/backend/kubernetes/helm/templates/web-service.yaml
    • Added a new Helm template for the web application service.
  • apps/backend/kubernetes/helm/values.yaml
    • Added new configuration section for web application, including enabled status, replica count, image, service type, ports, resources, autoscaling, node selectors, tolerations, and affinity.
    • Updated ingress section with examples for routing to web service.
    • Added new configuration section for sinkServices, including enabled status, image, JWT, API base URL, CronJob configuration, and bot services (Discord, Telegram).
  • apps/backend/kubernetes/scripts/k3d-setup.sh
    • Modified build_and_push_images function to include building and pushing the web image.
    • Updated Helm chart values to enable web service with NodePort.
  • apps/backend/kubernetes/sink-trigger/Cargo.toml
    • Added a new Cargo.toml for k8s-sink-trigger, including dependencies for HTTP requests, serde, and tracing.
  • apps/backend/kubernetes/sink-trigger/Dockerfile
    • Added a new Dockerfile for k8s-sink-trigger, including build and runtime stages.
  • apps/backend/kubernetes/sink-trigger/src/main.rs
    • Added a new Rust source file implementing the k8s-sink-trigger application, which reads environment variables and triggers a sink event via HTTP.
  • apps/backend/kubernetes/web/Dockerfile
    • Added a new Dockerfile for the web application, including build and runtime stages.
  • apps/backend/kubernetes/web/nginx.conf
    • Added a new Nginx configuration file for serving the static web application, including gzip compression, security headers, caching, routing, and health check.
  • apps/backend/local/api/package.json
    • Modified start_services script to cd .. && docker compose up -d.
  • apps/backend/local/runtime/Cargo.toml
    • Added flow-like-catalog with 'execute' feature.
  • apps/backend/local/runtime/src/main.rs
    • Added initialize_catalog() call for ONNX execution providers.
    • Modified process_queued_job to include user_context and profile in the ExecutionRequest.
  • apps/desktop/.env.example
    • Added new environment variables for desktop app configuration, including API URL, OAuth redirect URIs, and PostHog analytics.
  • apps/desktop/app/admin/sinks/page.tsx
    • Added a new TypeScript file implementing an Admin Sinks page for managing service tokens, including filtering, registration, and revocation.
  • apps/desktop/app/flow/page.tsx
    • Modified FlowEditPage to pass auth.user?.profile?.sub as sub prop to FlowWrapper.
  • apps/desktop/app/join/page.tsx
    • Modified JoinPage to add the joined app to the user's profile after joining.
  • apps/desktop/app/layout.tsx
    • Added DeeplinkNavigationHandler and DownloadNotificationProvider components.
    • Wrapped OAuthCallbackHandler with DeeplinkNavigationHandler.
  • apps/desktop/app/library/config/layout.tsx
    • Added DollarSignIcon import.
    • Added a new navigation item for 'Sales' under 'Config' requiring paid apps.
    • Modified navigation item filtering logic to consider requiresPaid property.
  • apps/desktop/app/library/config/sales/page.tsx
    • Added a new TypeScript file implementing a Sales page with SalesDashboard component.
  • apps/desktop/app/not-found.tsx
    • Replaced custom 404 page with NotFoundPage component from @tm9657/flow-like-ui.
  • apps/desktop/app/onboarding/done/page.tsx
    • Modified DonePage to expect get_profiles to return Record<string, ISettingsProfile>.
  • apps/desktop/app/onboarding/page.tsx
    • Added imports for invoke, tauriFetch, useRouter, useInvalidateTauriInvoke, OnlineProfile, getDefaultApiBase, and toLocalProfile.
    • Added hasInitiatedProfilePull flag and isPullingProfiles state.
    • Modified handleSignIn to include error handling.
    • Added a useEffect hook to pull server profiles on authentication, create local profiles, and remap IDs.
    • Added ExistingAccountBanner and RestoreProfilesLoading components.
  • apps/desktop/app/page.tsx
    • Modified Home component to use useCallback for checkProfiles.
    • Updated checkProfiles logic to refetch profiles and redirect to onboarding if no profiles are found after server sync.
  • apps/desktop/app/settings/profiles/page.tsx
    • Modified SettingsProfilesPage to expect get_profiles to return Record<string, ISettingsProfile>.
  • apps/desktop/app/settings/sinks/page.tsx
    • Updated getConfigSummary to include telegram, slack, github, file, web_watcher, and rss sink types.
    • Modified EmptyState component styling.
  • apps/desktop/app/settings/statistics/page.tsx
    • Added a new TypeScript file implementing a Statistics page for board usage, including node usage bar chart, category pie chart, board complexity treemap, pattern schematics, and boards table.
    • Includes loading skeletons and empty states.
  • apps/desktop/app/store/components/StoreHero.tsx
    • Added appId prop to StoreHero.
    • Added ShareButton component.
    • Modified ageRating display.
  • apps/desktop/app/store/components/StoreInfo.tsx
    • Added isPurchasing prop to DetailsCard.
    • Modified 'Buy' button to show 'Processing...' when isPurchasing is true.
  • apps/desktop/app/store/components/useStoreData.ts
    • Added openUrl as open import.
    • Added isPurchasing state.
    • Implemented onBuy function to handle app purchase, including calling backend.appState.purchaseApp and opening checkout URL.
  • apps/desktop/app/store/page.tsx
    • Added useEffect for purchaseStatus to handle purchase results from Stripe redirect.
    • Passed appId and isPurchasing to StoreHero and DetailsCard.
  • apps/desktop/app/use/page.tsx
    • Modified UsePage to use a memoized getEventsForced function that calls backend.eventState.getEvents with force: true.
  • apps/desktop/components/app-sidebar.tsx
    • Added FlowBackground import.
    • Removed Code2Icon import and commented out 'Developer' section.
    • Added BarChart3 and KeyRoundIcon imports.
    • Added 'Sinks' navigation item with 'Service Tokens' sub-item.
    • Modified SidebarInset to use FlowBackground.
    • Modified Profiles component to expect get_profiles to return Record<string, ISettingsProfile>.
    • Modified NavMain to pass auth?.isAuthenticated and auth?.user?.profile?.sub to backend.userState.getInfo for conditional fetching.
    • Modified NavMain to listen for tauri://error when opening new webview windows.
    • Modified NavUser to pass auth?.isAuthenticated and auth?.user?.profile?.sub to backend.userState.getProfile and backend.userState.getInfo for conditional fetching.
    • Added 'Board Statistics' dropdown menu item.
    • Modified NavUser sign-in logic to include error handling.
  • apps/desktop/components/auth-provider.tsx
    • Added IProfile import.
    • Added console.warn to OIDCTokenProvider.getTokens.
    • Modified DesktopAuthProvider to handle currentProfile.data being null/undefined by creating an effectiveProfile.
    • Added ProfileSyncer component to AuthInner.
  • apps/desktop/components/deeplink-navigation-handler.tsx
    • Added a new TypeScript file implementing DeeplinkNavigationHandler to listen for deep link events and navigate accordingly.
  • apps/desktop/components/download-notification-provider.tsx
    • Added a new TypeScript file implementing DownloadNotificationProvider to show desktop notifications or toasts on download completion.
  • apps/desktop/components/global-anchor-component.tsx
    • Modified GlobalAnchorHandler to listen for tauri://error when creating new webview windows.
  • apps/desktop/components/spotlight-wrapper.tsx
    • Modified SpotlightWrapper to expect get_profiles to return Record<string, ISettingsProfile>.
    • Modified profile switching logic to iterate over Object.values(profiles.data).
  • apps/desktop/components/tauri-provider.tsx
    • Added tauriFetch import.
    • Added IApiKeyState, ISalesState, IUsageState to IBackendState interface.
    • Added OnlineProfile and toLocalProfile imports.
    • Added ApiKeyState, SalesState, UsageState to TauriBackend constructor.
    • Modified TauriBackend.uploadFile to include x-ms-blob-type header for Azure Blob Storage.
    • Modified ProfileSyncer to handle profile synchronization with the backend, including pulling server profiles, uploading local images, remapping IDs, and merging profiles.
  • apps/desktop/components/tauri-provider/api-key-state.ts
    • Added a new TypeScript file implementing ApiKeyState for managing API keys (technical users).
  • apps/desktop/components/tauri-provider/app-state.ts
    • Added IPurchaseResponse import.
    • Implemented purchaseApp method to handle app purchases, including calling the backend API and opening the checkout URL.
  • apps/desktop/components/tauri-provider/bit-state.ts
    • Implemented getProfileBits method to retrieve bits in the current profile.
  • apps/desktop/components/tauri-provider/board-state.ts
    • Added ICommentType import.
    • Added ProgressToastData, finishAllProgressToasts, showProgressToast imports.
    • Implemented preserveSecretValues to prevent overwriting secret variable values.
    • Modified getBoard to call presignMediaComments for media comments.
    • Modified getBoard to use preserveSecretValues when updating local state.
    • Implemented presignMediaComments to get presigned URLs for media comments.
    • Modified executeBoard to include filter_secrets: Some(false) in the payload.
    • Modified executeBoard and streamExecuteBoard to handle toast and progress events, and call finishAllProgressToasts on completion/error.
  • apps/desktop/components/tauri-provider/event-state.ts
    • Added ProgressToastData, finishAllProgressToasts, showProgressToast imports.
    • Added toast import.
    • Added streamFetcher import.
    • Modified getEvents to support force parameter for immediate remote sync.
    • Modified createEvent to include profile_id in the payload.
    • Implemented executeEventRemote for remote event execution with streaming, toast, and progress event handling.
  • apps/desktop/components/tauri-provider/helper-state.ts
    • Modified getTemporaryFile to include filename in the query parameters.
    • Modified processImage to include filename in the asset URL.
  • apps/desktop/components/tauri-provider/sales-state.ts
    • Added a new TypeScript file implementing SalesState for managing sales-related data like overview, stats, purchases, prices, and discounts.
  • apps/desktop/components/tauri-provider/template-state.ts
    • Modified getTemplates and searchTemplates to use a composite key (appId:templateId) for mergedData map to handle multiple templates per app.
  • apps/desktop/components/tauri-provider/usage-state.ts
    • Added a new TypeScript file implementing UsageState for retrieving usage history and summaries for LLM, embeddings, and executions.
  • apps/desktop/components/tauri-provider/user-state.ts
    • Implemented getProfiles to return IProfile[].
    • Implemented getAllSettingsProfiles to return ISettingsProfile[].
  • apps/desktop/components/toast-provider.tsx
    • Added ProgressToastData, finishAllProgressToasts, showProgressToast imports.
    • Modified ToastProvider to listen for progress, completed, and error events from the backend and handle them with showProgressToast and finishAllProgressToasts.
  • apps/desktop/components/useInvoke.tsx
    • Added useQueryClient import.
    • Added useInvalidateTauriInvoke hook for invalidating Tauri invoke queries.
  • apps/desktop/index.html
    • Modified viewport meta tag to include maximum-scale=1.0, viewport-fit=cover.
    • Added data-desktop-app attribute to the body tag.
  • apps/desktop/lib/api.ts
    • Added console.log statements for API fetching debug.
  • apps/desktop/lib/event-config.ts
    • Added TelegramConfig import.
    • Updated EVENT_CONFIG.events_chat.configInterfaces to include telegram.
    • Updated EVENT_CONFIG.events_chat.eventTypes and withSink to include telegram.
    • Added sinkAvailability for discord and telegram.
    • Added sink_type to email, api, deeplink, and cron configs.
    • Added sinkAvailability for email, api, deeplink, and cron.
  • apps/desktop/lib/profile-sync.ts
    • Added a new TypeScript file defining OnlineProfile type and utility functions toLocalProfile and getDefaultApiBase for profile synchronization.
  • apps/desktop/package.json
    • Updated @tauri-apps/api and various @tauri-apps/plugin-* versions.
    • Updated next version.
    • Updated @tauri-apps/cli version.
  • apps/desktop/public/flow/icons/telegram.svg
    • Added a new SVG icon for Telegram.
  • apps/desktop/public/swimlanes/swimlanes.json
    • Updated featured-3 swimlane item with new title, description, link, and badge.
    • Updated model-1 and model-2 model IDs.
    • Updated model-spotlight swimlane item with new title, description, image, badge, and link.
    • Renamed productivity swimlane to whats-new and updated its items with release information.
    • Renamed trending swimlane to learn and updated its items with learning resources.
    • Updated Discord link in learn-community.
  • apps/desktop/src-tauri/Cargo.toml
    • Updated tauri-build and tauri versions.
    • Updated various tauri-plugin-* versions.
    • Added teloxide, pulldown-cmark, copilot-sdk, once_cell, tokio, and rayon dependencies.
    • Updated tauri-plugin-single-instance and tauri-plugin-window-state versions.
  • apps/desktop/src-tauri/Info.plist
    • Added ITSAppUsesNonExemptEncryption key.
  • apps/desktop/src-tauri/build.rs
    • Added logic to link against system zlib on iOS for flate2 compatibility.
  • apps/desktop/src-tauri/capabilities/desktop.json
    • Added sidebar-* and window-* to windows array.
    • Added https://localhost:*, http://127.0.0.1:*, and https://127.0.0.1:* to http:default allow list.
  • apps/desktop/src-tauri/capabilities/mobile.json
    • Added https://localhost:* and https://127.0.0.1:* to http:default allow list.
  • apps/desktop/src-tauri/gen/apple/flow-like-desktop.xcodeproj/project.pbxproj
    • Added OTHER_LDFLAGS = "-lz"; to build configurations.
  • apps/desktop/src-tauri/gen/apple/flow-like-desktop_iOS/Info.plist
    • Updated CFBundleShortVersionString and CFBundleVersion.
    • Added ITSAppUsesNonExemptEncryption key.
    • Removed CFBundleURLTypes and moved NSPhotoLibraryAddUsageDescription.
  • apps/desktop/src-tauri/gen/schemas/capabilities.json
    • Updated desktop and mobile capabilities to reflect changes in desktop.json and mobile.json.
    • Added http:allow-fetch-cancel-body and http:deny-fetch-cancel-body permissions.
  • apps/desktop/src-tauri/gen/schemas/iOS-schema.json
    • Updated fs:scope markdown description.
    • Updated http:default markdown description to include allow-fetch-cancel-body.
    • Added http:allow-fetch-cancel-body and http:deny-fetch-cancel-body permissions.
  • apps/desktop/src-tauri/gen/schemas/mobile-schema.json
    • Updated fs:scope markdown description.
    • Updated http:default markdown description to include allow-fetch-cancel-body.
    • Added http:allow-fetch-cancel-body and http:deny-fetch-cancel-body permissions.
  • apps/desktop/src-tauri/src/deeplink.rs
    • Modified handle_deep_link to include store and join commands.
    • Implemented handle_store and handle_join functions to emit deep link events.
  • apps/desktop/src-tauri/src/event_bus.rs
    • Modified EventBusEvent.execute to set filter_secrets: Some(false) for desktop execution.
  • apps/desktop/src-tauri/src/event_sink.rs
    • Modified EventConfig enum to use #[serde(tag = "sink_type")] and explicitly rename variants.
  • apps/desktop/src-tauri/src/event_sink/discord.rs
    • Added Colour, CreateEmbed imports.
    • Modified DiscordEventHandler.message to get bot_user_id and pass it to prepare_message_payload.
    • Modified prepare_message_payload to include bot_token and bot_user_id in the payload.
    • Implemented create_reasoning_embed to generate Discord embeds for reasoning/plan steps.
    • Modified update_discord_message to accept reasoning_embed and edit_count, and implement adaptive rate limiting for message edits.
    • Modified fire_discord_event to manage reasoning_state, edit_count, and last_sent_content for streaming updates with embeds.
  • apps/desktop/src-tauri/src/event_sink/manager.rs
    • Implemented parse_config_json for backwards compatibility with older config formats.
    • Modified RegistrationStorage to use parse_config_json.
    • Modified logging to use println! instead of tracing::debug/info/error for sink manager messages.
    • Added telegram and slack sink types to EventSinkManager.start_sink_type.
  • apps/desktop/src-tauri/src/event_sink/stubs.rs
    • Removed the stub implementation for TelegramSink as it's now fully implemented.
  • apps/desktop/src-tauri/src/event_sink/telegram.rs
    • Full implementation of TelegramSink for Telegram bot integration.
    • Includes TelegramClientManager for managing multiple bot instances.
    • Functions for should_process_message, prepare_message_payload, markdown_to_telegram_html, format_reasoning_for_telegram, update_telegram_message, send_telegram_attachments, and fire_telegram_event.
    • Database schema and CRUD operations for Telegram bots and handlers.
  • apps/desktop/src-tauri/src/functions.rs
    • Added statistics module.
  • apps/desktop/src-tauri/src/functions/a2ui/route.rs
    • Removed std::collections::HashMap import.
    • Modified get_app_routes to derive routes from events with route property.
    • Modified get_app_route_by_path to find event by route.
    • Modified get_default_app_route to prioritize events with is_default=true then route="/".
    • Modified set_app_route to update the event's route property and check for existing routes.
    • Modified delete_app_route_by_path and delete_app_route_by_event to clear the route property from the event.
    • Modified set_app_routes to clear all existing routes and then set new ones on events.
  • apps/desktop/src-tauri/src/functions/ai.rs
    • Added copilot_sdk_tools module.
  • apps/desktop/src-tauri/src/functions/ai/copilot.rs
    • Added BoardCommand import.
    • Modified copilot_chat to check for copilot: prefix in model_id and delegate to copilot_sdk_chat_internal.
    • Implemented copilot_sdk_chat_internal for handling GitHub Copilot SDK interactions, including tool creation, session management, and event processing.
    • Added GitHub Copilot SDK integration functions: copilot_sdk_start, copilot_sdk_stop, copilot_sdk_is_running, copilot_sdk_list_models, copilot_sdk_get_auth_status.
    • Defined SpecializedAgentType enum and system prompts for specialized agents (FRONTEND_AGENT_PROMPT, BACKEND_AGENT_PROMPT, GENERAL_AGENT_PROMPT, BOARD_AGENT_PROMPT, A2UI_AGENT_PROMPT).
    • Implemented copilot_sdk_create_agent_session for creating sessions with specialized agents.
  • apps/desktop/src-tauri/src/functions/ai/copilot_sdk_tools.rs
    • Added a new Rust source file defining Copilot SDK tool adapters for catalog_search, emit_commands, get_node_details, get_unconfigured_nodes, list_board_nodes, and emit_ui.
  • apps/desktop/src-tauri/src/functions/flow/run.rs
    • Modified execute_internal to set payload.filter_secrets = Some(false) for desktop execution.
    • Modified execute_internal to call internal_run.set_offline_user_context().
  • apps/desktop/src-tauri/src/functions/settings/profiles.rs
    • Added std::path::PathBuf import.
    • Implemented get_profiles_raw to retrieve raw user profiles.
    • Implemented get_current_profile_id to get the ID of the current profile.
    • Implemented remap_profile_id to change a profile's ID and update references.
    • Implemented read_profile_icon to read profile icon file bytes.
    • Implemented get_profile_icon_path to get the filesystem path for a profile's icon or thumbnail.
  • apps/desktop/src-tauri/src/functions/statistics.rs
    • Added a new Rust source file implementing get_board_statistics to analyze board usage, node patterns, and provide overall statistics.
  • apps/desktop/src-tauri/src/lib.rs
    • Added tray_update_state stub for non-desktop platforms.
    • Added initialize_catalog() call.
    • Removed TauriTrayState management from build().manage().
    • Added TauriTrayState management conditionally for desktop platforms.
    • Added tauri_plugin_notification::init() plugin.
    • Modified event bus loop to spawn each event execution as a separate task.
    • Added new Tauri commands: get_profiles_raw, get_current_profile_id, remap_profile_id, read_profile_icon, get_profile_icon_path, copilot_sdk_start, copilot_sdk_stop, copilot_sdk_is_running, copilot_sdk_list_models, copilot_sdk_get_auth_status, copilot_sdk_create_agent_session, and get_board_statistics.
  • apps/desktop/src-tauri/src/state.rs
    • Removed tray::TrayRuntimeState import and TauriTrayState definition conditionally for desktop platforms.
  • apps/docs/astro.config.mjs
    • Reorganized sidebar navigation to categorize documentation by audience (Everyone, App Builders, DevOps/Admins, Extension Developers, Core Contributors, Enterprise, Reference).
    • Added new topics and sub-sections, including 'FlowPilot AI', 'Packages & Extensions', 'By Topic' (GenAI, Data Science, Internal Tools, Desktop Automation, Document Processing, API Integrations, Chatbots, Data Pipelines, Business Intelligence, Coming From), 'WASM Nodes', 'A2UI Development', 'Event Sinks', 'Contributing Guide', 'Translations', 'Markdown Formatting'.
  • apps/docs/src/content/docs/dev/sinks/cron.mdx
    • Added a new documentation file for the Cron Sink.
  • apps/docs/src/content/docs/dev/sinks/discord.mdx
    • Added a new documentation file for the Discord Sink.
  • apps/docs/src/content/docs/dev/sinks/http.mdx
    • Added a new documentation file for the HTTP Sink.
  • apps/docs/src/content/docs/dev/sinks/index.mdx
    • Added a new documentation file providing an overview of Event Sinks.
  • apps/docs/src/content/docs/dev/sinks/telegram.mdx
    • Added a new documentation file for the Telegram Sink.
  • apps/docs/src/content/docs/dev/storage-providers.md
    • Updated log path from logs/runs/{app_id}/* to runs/{app_id}/*.
  • apps/docs/src/content/docs/reference/markdown-formatting.mdx
    • Added a new documentation file for Markdown Formatting, including interactive charts.
  • apps/docs/src/content/docs/studio/flowpilot.md
    • Added a new documentation file for FlowPilot AI Assistant.
  • apps/docs/src/content/docs/studio/overview.md
    • Updated overview to include FlowPilot.
  • apps/docs/src/content/docs/topics/api-integrations/overview.md
    • Added a new documentation file for API Integrations.
  • apps/docs/src/content/docs/topics/business-intelligence/overview.md
    • Added a new documentation file for Business Intelligence.
  • apps/docs/src/content/docs/topics/chatbots/overview.md
    • Added a new documentation file for Building Chatbots.
  • apps/docs/src/content/docs/topics/coming-from/developers.md
    • Added a new documentation file for Developers coming to Flow-Like.
  • apps/docs/src/content/docs/topics/coming-from/langchain.md
    • Added a new documentation file for LangChain users coming to Flow-Like.
  • apps/docs/src/content/docs/topics/coming-from/n8n.md
    • Added a new documentation file for n8n users coming to Flow-Like.
Activity
  • This pull request appears to be the initial commit for these features, as there is no visible external review activity or comments from other users yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This is a huge and impressive pull request that introduces a web application, a suite of backend services for event sinks, and major improvements to logging, configuration, and developer experience. The new features like the aws-event-bridge lambda, the sink-services for Docker Compose, and the Kubernetes sink triggers are well-architected. The consistent logging improvements across all services are a great step towards better observability. The addition of profile syncing and a purchase flow for the desktop app are also significant enhancements. My review focuses on some opportunities for performance optimization in the new event-bridge service and a potential performance regression in route handling. I've also included some minor suggestions for consistency and code clarity. Overall, this is a fantastic contribution.

Comment on lines +54 to 66
for event_id in &app.events {
if let Ok(event) = app.get_event(event_id, None).await
&& event.route.as_deref() == Some(&path)
{
return Ok(Some(RouteMapping {
path,
event_id: event.id,
}));
}
}

Ok(None)
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

This implementation now iterates through all events in an app to find a matching route. For apps with a large number of events, this O(n) lookup on every request could become a performance bottleneck. Consider re-introducing a cached HashMap<String, String> on the App struct that maps routes to event IDs. This map could be populated once when the app is loaded, ensuring O(1) lookups for routes.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is only for local file reads (small config files for events). Maximum 30 events / use case. Should be fine.

Comment on lines +13 to +24
fn get_sink_jwt() -> Result<&'static str, Error> {
if let Some(value) = SINK_JWT.get() {
return Ok(value.as_str());
}

let value = env::var("SINK_JWT").map_err(|_| Error::from("SINK_JWT not set"))?;
let _ = SINK_JWT.set(value);
Ok(SINK_JWT
.get()
.expect("SINK_JWT value must be initialized")
.as_str())
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This function can be simplified. You can use a single match on the env::var result and then rely on OnceLock::set's behavior (it's fine if it fails because another thread set the value). The expect is safe, but this approach is slightly cleaner and avoids the unwrap.

Suggested change
fn get_sink_jwt() -> Result<&'static str, Error> {
if let Some(value) = SINK_JWT.get() {
return Ok(value.as_str());
}
let value = env::var("SINK_JWT").map_err(|_| Error::from("SINK_JWT not set"))?;
let _ = SINK_JWT.set(value);
Ok(SINK_JWT
.get()
.expect("SINK_JWT value must be initialized")
.as_str())
}
fn get_sink_jwt() -> Result<&'static str, Error> {
if let Some(value) = SINK_JWT.get() {
return Ok(value.as_str());
}
let value = env::var("SINK_JWT").map_err(|_| Error::from("SINK_JWT not set"))?;
// The `set` method returns an error if the value is already set, which is fine.
// We can ignore the result, as `get` will return the value in either case.
let _ = SINK_JWT.set(value);
// `get` is guaranteed to return `Some` here.
Ok(SINK_JWT.get().unwrap().as_str())
}

}

tracing::info!("🚀 Starting {} sink", sink_type);
println!("🚀 [SINK_MANAGER] Starting {} sink", sink_type);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

It seems tracing has been replaced with println!. While this works for debugging, using the tracing crate is more idiomatic and flexible for logging in Rust applications. It allows for structured logging, different log levels, and configurable output sinks. I'd recommend sticking with tracing::info! and configuring a subscriber that prints to stdout for debugging purposes if needed.

Suggested change
println!("🚀 [SINK_MANAGER] Starting {} sink", sink_type);
tracing::info!("🚀 [SINK_MANAGER] Starting {} sink", sink_type);

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This is a massive pull request introducing a web app, a new aws-event-bridge lambda, and services for handling event sinks like cron, Discord, and Telegram. It also significantly improves logging and error monitoring across backend services. A major new feature is the integration of the GitHub Copilot SDK for AI-assisted development. Profile syncing between devices has been implemented. There are also many dependency updates and configuration changes to support these new features. My review focuses on performance, maintainability, and correctness. I've identified a performance issue in the new event-bridge lambda and some maintainability concerns regarding duplicated files and fragile build steps. Overall, this is a substantial and well-executed feature addition.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This is a substantial pull request that introduces a wide range of new features and improvements, including a new web application, event sink services for cron, Discord, and Telegram, and significant enhancements to logging, profile syncing, and AI capabilities with GitHub Copilot integration. The overall code quality is high, and the new features are well-structured. I've identified a few areas for improvement, primarily focusing on performance and observability in the new aws-event-bridge Lambda. Specifically, I've suggested reusing the reqwest::Client and caching environment variables to improve performance, and enhancing error logging for better debuggability. I've also made minor suggestions for file formatting consistency. The parallelization of event handling in the Tauri backend is a noteworthy improvement that will enhance responsiveness.

let client = get_http_client();
let trigger_url = format!("{}/api/v1/sink/trigger/async", api_base_url);

let request_body = TriggerRequest {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using unwrap_or_default() when reading the response body can hide potential errors during body deserialization. If reading the body fails, the log will show an empty body, which can be misleading when debugging API errors. It's better to handle the Result from response.text().await and log the error if it occurs.

Suggested change
let request_body = TriggerRequest {
let body = response.text().await.unwrap_or_else(|e| format!("<failed to read response body: {}>", e));

@felix-schultz felix-schultz requested a review from Copilot February 9, 2026 00:36
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR expands the web/desktop app and self-hosting stack with new sink capabilities, improved observability, and additional infrastructure components (Kubernetes + Docker Compose), while also adding FlowPilot and several desktop app enhancements (profiles sync, purchases, notifications, deeplinks).

Changes:

  • Added new sink infrastructure (Kubernetes sink-trigger + Docker Compose sink-services) and a static web container for self-hosting.
  • Improved desktop app capabilities (Telegram sink config, profile sync helpers, purchase flow, notifications, deeplink navigation) and adjusted Tauri capabilities/windows.
  • Standardized logging/tracing initialization across multiple Rust services and introduced new docs for FlowPilot + sinks.

Reviewed changes

Copilot reviewed 145 out of 1345 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
apps/docs/src/content/docs/studio/overview.md Adds FlowPilot to Studio overview navigation list
apps/docs/src/content/docs/studio/flowpilot.md New FlowPilot documentation page and provider setup instructions
apps/docs/src/content/docs/self-hosting/kubernetes/storage.mdx Updates documented log path prefix to runs/...
apps/docs/src/content/docs/self-hosting/docker-compose/storage.mdx Updates documented log path prefix to runs/...
apps/docs/src/content/docs/dev/storage-providers.md Updates documented log path prefix to runs/...
apps/docs/src/content/docs/dev/sinks/telegram.mdx New Telegram sink documentation
apps/docs/src/content/docs/dev/sinks/index.mdx New sinks overview documentation
apps/docs/src/content/docs/dev/sinks/http.mdx New HTTP sink documentation
apps/docs/src/content/docs/dev/sinks/discord.mdx New Discord sink documentation
apps/docs/src/content/docs/dev/sinks/cron.mdx New Cron sink documentation
apps/desktop/src-tauri/src/state.rs Makes tray runtime state desktop-only via cfg gating
apps/desktop/src-tauri/src/lib.rs Initializes catalog runtime, adds notification plugin, spawns event executions, expands Tauri commands
apps/desktop/src-tauri/src/functions/settings/profiles.rs Adds profile sync commands + profile icon access helpers
apps/desktop/src-tauri/src/functions/flow/run.rs Disables secret filtering for desktop runs; sets offline user context
apps/desktop/src-tauri/src/functions/ai.rs Adds Copilot SDK tools module
apps/desktop/src-tauri/src/functions.rs Adds statistics module export
apps/desktop/src-tauri/src/event_sink/stubs.rs Removes Telegram sink stub implementation
apps/desktop/src-tauri/src/event_sink.rs Switches EventConfig serde format to tagged sink_type
apps/desktop/src-tauri/src/event_bus.rs Marks event bus triggers as trusted (no secret filtering)
apps/desktop/src-tauri/src/deeplink.rs Adds store and join deep link handlers emitting UI events
apps/desktop/src-tauri/gen/schemas/mobile-schema.json Updates generated Tauri schema docs (fs/http permissions)
apps/desktop/src-tauri/gen/schemas/iOS-schema.json Updates generated Tauri schema docs (fs/http permissions)
apps/desktop/src-tauri/gen/schemas/capabilities.json Updates generated capabilities (more windows, additional localhost origins)
apps/desktop/src-tauri/gen/apple/flow-like-desktop_iOS/Info.plist Bumps app version; adds encryption + photo library usage keys; removes URL scheme block
apps/desktop/src-tauri/gen/apple/flow-like-desktop.xcodeproj/project.pbxproj Adds -lz linker flag for iOS targets
apps/desktop/src-tauri/capabilities/mobile.json Allows https localhost origins for mobile capability
apps/desktop/src-tauri/capabilities/desktop.json Expands allowed window labels and localhost origins
apps/desktop/src-tauri/build.rs Links zlib on iOS in build script
apps/desktop/src-tauri/Info.plist Adds ITSAppUsesNonExemptEncryption key
apps/desktop/src-tauri/Cargo.toml Updates Tauri deps and adds Telegram/Copilot SDK related deps
apps/desktop/public/swimlanes/swimlanes.json Updates desktop “swimlanes” content (docs/blog links, IDs)
apps/desktop/package.json Updates Tauri + Next.js dependency versions
apps/desktop/lib/profile-sync.ts Adds OnlineProfile mapping and default API base helper
apps/desktop/lib/event-config.ts Adds telegram sink config defaults + sink availability metadata
apps/desktop/lib/api.ts Adds extra API debug logging on fetches
apps/desktop/index.html Adjusts viewport settings; adds data-desktop-app attribute
apps/desktop/components/useInvoke.tsx Adds query invalidation helper for Tauri invokes
apps/desktop/components/toast-provider.tsx Adds progress/completed/error listeners for toast/progress UX
apps/desktop/components/tauri-provider/user-state.ts Adds methods to fetch profiles and all settings profiles
apps/desktop/components/tauri-provider/usage-state.ts Adds usage history/summary state implementation
apps/desktop/components/tauri-provider/template-state.ts Fixes template metadata merge keying by (appId, templateId)
apps/desktop/components/tauri-provider/sales-state.ts Adds sales state implementation for UI
apps/desktop/components/tauri-provider/helper-state.ts Includes filename in tmp asset flow and asset URL
apps/desktop/components/tauri-provider/event-state.ts Adds remote streaming execution + progress/toast handling; adds force sync option
apps/desktop/components/tauri-provider/bit-state.ts Adds getProfileBits method
apps/desktop/components/tauri-provider/app-state.ts Adds purchaseApp method
apps/desktop/components/tauri-provider/api-key-state.ts Adds API key management state
apps/desktop/components/spotlight-wrapper.tsx Adjusts profiles invoke shape to Record and iterates values
apps/desktop/components/global-anchor-component.tsx Adds WebviewWindow error listener
apps/desktop/components/download-notification-provider.tsx Adds desktop notification fallback for completed downloads
apps/desktop/components/deeplink-navigation-handler.tsx Routes UI based on deeplink events from Tauri
apps/desktop/components/auth-provider.tsx Adds profile syncer, more robust OpenID config fetch, and additional logging
apps/desktop/components/app-sidebar.tsx Adds FlowBackground wrapper, sinks/admin navigation, and auth-aware queries
apps/desktop/app/use/page.tsx Forces remote event refresh via memoized getEvents wrapper
apps/desktop/app/store/page.tsx Handles Stripe redirect status; wires purchasing state to UI
apps/desktop/app/store/components/useStoreData.ts Implements purchase flow opening browser checkout and adds purchasing guard
apps/desktop/app/store/components/StoreInfo.tsx Disables Buy button and shows “Processing…” while purchasing
apps/desktop/app/store/components/StoreHero.tsx Adds ShareButton and requires appId prop
apps/desktop/app/settings/sinks/page.tsx Expands sink summary formatting and improves empty state layout
apps/desktop/app/settings/profiles/page.tsx Adjusts profiles invoke shape to Record
apps/desktop/app/page.tsx Refines onboarding redirect logic with refetch and replace
apps/desktop/app/onboarding/page.tsx Adds sign-in banner and profile restore from server after auth
apps/desktop/app/onboarding/done/page.tsx Adjusts profiles invoke shape to Record
apps/desktop/app/not-found.tsx Uses shared NotFoundPage component
apps/desktop/app/library/config/sales/page.tsx Adds Sales dashboard route
apps/desktop/app/library/config/layout.tsx Adds Sales nav item and paid-gating condition
apps/desktop/app/layout.tsx Adds download notifications + deeplink navigation handler wrappers
apps/desktop/app/join/page.tsx Adds app to local profile after joining via invite link
apps/desktop/app/flow/page.tsx Passes authenticated user sub into FlowWrapper
apps/desktop/app/admin/sinks/page.tsx Adds admin sink token management page
apps/desktop/.env.example Adds desktop env example including API + redirect URLs
apps/backend/local/runtime/src/main.rs Initializes catalog at startup and forwards user_context/profile in queued jobs
apps/backend/local/runtime/Cargo.toml Adds flow-like-catalog dependency to local runtime
apps/backend/local/api/package.json Fixes docker compose start script path
apps/backend/kubernetes/web/nginx.conf Adds nginx config for static web export with /health
apps/backend/kubernetes/web/Dockerfile Adds multi-stage build for Next.js static export served by nginx
apps/backend/kubernetes/sink-trigger/src/main.rs Adds ultra-lean k8s sink trigger binary
apps/backend/kubernetes/sink-trigger/Dockerfile Adds distroless build for sink-trigger
apps/backend/kubernetes/sink-trigger/Cargo.toml Adds sink-trigger crate manifest
apps/backend/kubernetes/scripts/k3d-setup.sh Builds and pushes web image; adds helm web values
apps/backend/kubernetes/helm/values.yaml Adds configurable web deployment and sinkServices config
apps/backend/kubernetes/helm/templates/web-service.yaml Adds web service template
apps/backend/kubernetes/helm/templates/web-hpa.yaml Adds web HPA template
apps/backend/kubernetes/helm/templates/web-deployment.yaml Adds web deployment template
apps/backend/kubernetes/helm/templates/sink-trigger-image.yaml Adds sink-trigger image build documentation configmap
apps/backend/kubernetes/helm/templates/sink-secrets.yaml Adds sink services secret/configmap templates
apps/backend/kubernetes/helm/templates/sink-cronjob.yaml Adds RBAC + CronJob structure documentation template
apps/backend/kubernetes/helm/templates/ingress.yaml Adds option to route ingress paths to web service
apps/backend/kubernetes/helm/templates/_helpers.tpl Adds web selector/labels helpers
apps/backend/kubernetes/executor/src/main.rs Initializes catalog runtime and telemetry in k8s executor
apps/backend/kubernetes/executor/Cargo.toml Adds local-ml feature to flow-like-catalog dependency
apps/backend/kubernetes/README.md Documents web deployment and local port-forwarding
apps/backend/docker-compose/web/nginx.conf Adds nginx config for static web export with /health
apps/backend/docker-compose/web/Dockerfile Adds multi-stage build for web static export in Compose
apps/backend/docker-compose/sink-services/src/main.rs Adds sink services runner with cron/discord/telegram tasks
apps/backend/docker-compose/sink-services/src/cron.rs Adds cron scheduler that syncs schedules from API
apps/backend/docker-compose/sink-services/src/api_client.rs Adds API client for triggering sinks and fetching schedules/bots
apps/backend/docker-compose/sink-services/Dockerfile Adds container build for sink services
apps/backend/docker-compose/sink-services/Cargo.toml Adds sink services crate dependencies and feature flags
apps/backend/docker-compose/runtime/src/main.rs Initializes catalog runtime and forwards user_context/profile in queued jobs
apps/backend/docker-compose/runtime/Cargo.toml Adds flow-like-catalog dependency to compose runtime
apps/backend/docker-compose/flow-like.config.example.json Adds example config including supported sinks list
apps/backend/docker-compose/docker-compose.yml Adds sink-services + web services to compose stack
apps/backend/docker-compose/README.md Documents web service and supported sinks in Compose
apps/backend/docker-compose/.env.example Adds web app env variables for compose stack
apps/backend/aws/runtime-async/src/execution.rs Removes old SQS execution handler file
apps/backend/aws/runtime-async/README.md Removes old runtime-async README
apps/backend/aws/media-transformer/src/main.rs Switches to tracing_subscriber with env-controlled log levels
apps/backend/aws/file-tracker/src/main.rs Switches to tracing_subscriber with env-controlled log levels
apps/backend/aws/executor/src/main.rs Adds env log filtering, Sentry integration, and catalog initialization
apps/backend/aws/executor/Cargo.toml Adds flow-like-catalog dependency for executor lambda
apps/backend/aws/executor-async/src/main.rs Adds env log filtering, Sentry integration, and catalog initialization
apps/backend/aws/executor-async/src/execution.rs Extends SQS payload to include user_context/profile
apps/backend/aws/executor-async/Cargo.toml Adds catalog + tracing/sentry deps
apps/backend/aws/event-bridge/src/main.rs Adds EventBridge handler that triggers sink endpoint
apps/backend/aws/event-bridge/Dockerfile Adds Lambda container build for event-bridge
apps/backend/aws/event-bridge/Cargo.toml Renames crate and adds reqwest + cloudwatch_events dep
apps/backend/aws/api/src/main.rs Uses warn env filter helper and Sentry-aware tracing initialization
apps/backend/aws/api/Cargo.toml Enables lambda feature for flow-like-api
about.toml Adds cargo-about license configuration
Cargo.toml Adds new workspace members and dependencies (sinks, event-bridge, flate2 rust backend, copilot sdk)
.github/instructions/general-coding.instructions.md Adds guidance about using subagents
.github/instructions/api.instructions.md Adds API security/OpenAPI/performance instructions
Comments suppressed due to low confidence (1)

apps/desktop/lib/api.ts:1

  • These logs will run on every request and can leak sensitive info (URLs with identifiers, response objects/headers) and add noise/perf overhead. Please gate behind an explicit debug flag (e.g. process.env.NEXT_PUBLIC_API_DEBUG === '1') or remove before production builds.
import { fetch as tauriFetch } from "@tauri-apps/plugin-http";

Comment on lines +527 to +542
// Spawn each event execution as a separate task for parallel processing
let handle_clone = handle.clone();
let flow_like_state_clone = flow_like_state.clone();
let hub_clone = hub.clone();

tokio::spawn(async move {
match event
.execute(&handle_clone, flow_like_state_clone, &hub_clone)
.await
{
Ok(meta) => _ = meta,
Err(e) => {
eprintln!("Error executing event: {:?}", e);
}
}
}
});
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This introduces unbounded parallelism: a burst of events can spawn unlimited tasks and overwhelm CPU/memory (and any shared resources the sinks touch). Consider adding a concurrency limit (e.g., a tokio::sync::Semaphore with acquire_owned() inside the loop, or a bounded worker pool/JoinSet) so event executions are processed in parallel but within a safe cap.

Copilot uses AI. Check for mistakes.
Comment on lines +451 to +468
pub async fn read_profile_icon(icon_path: String) -> Result<Vec<u8>, TauriFunctionError> {
let decoded_path = urlencoding::decode(&icon_path)
.map_err(|e| TauriFunctionError::new(&format!("Failed to decode path: {}", e)))?;

let path = PathBuf::from(decoded_path.as_ref());

if !path.exists() {
return Err(TauriFunctionError::new(&format!(
"Icon file not found: {}",
path.display()
)));
}

let bytes = std::fs::read(&path)
.map_err(|e| TauriFunctionError::new(&format!("Failed to read icon file: {}", e)))?;

Ok(bytes)
}
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This Tauri command allows the renderer to read arbitrary files from the filesystem by passing a path (after URL-decoding). That’s a high-risk local file disclosure primitive. Prefer taking (profile_id, field) and resolving to a validated/owned path server-side, or strictly validate that path is within an allowlisted directory (e.g., app data/profile icon dir) before reading.

Copilot uses AI. Check for mistakes.
Comment on lines +232 to +233
println!("Join deep link: app_id={:?}, token={:?}", app_id, token);

Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This logs the invite token in plaintext. Tokens are credentials and can end up in persistent logs/crash reports. Please remove the token from logs (or mask it, e.g. show only a short prefix) before shipping.

Suggested change
println!("Join deep link: app_id={:?}, token={:?}", app_id, token);
let masked_token = token.as_ref().map(|t| {
let prefix: String = t.chars().take(4).collect();
format!("{}***", prefix)
});
println!("Join deep link: app_id={:?}, token={:?}", app_id, masked_token);

Copilot uses AI. Check for mistakes.
Comment on lines +33 to +42
const joinUnlisten = listen<DeeplinkJoinPayload>(
"deeplink/join",
(event) => {
const { appId, token } = event.payload;
if (appId && token) {
console.log("Navigating to join page:", appId, token);
router.push(`/join?appId=${appId}&token=${token}`);
}
},
);
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This logs the invite token in the browser console. That can leak via screenshots, debugging tools, or shared logs. Please remove the token from the log line (or avoid logging entirely here).

Copilot uses AI. Check for mistakes.
Comment on lines 81 to 96
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[serde(tag = "sink_type")]
pub enum EventConfig {
#[serde(rename = "discord")]
Discord(DiscordSink),
#[serde(rename = "email")]
Email(EmailSink),

#[serde(rename = "slack")]
Slack(SlackSink),
#[serde(rename = "telegram")]
Telegram(TelegramSink),

// Check for the state of a website and trigger the event when it changes
#[serde(rename = "web_watcher")]
WebWatcher(WebWatcherSink),
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Switching from #[serde(untagged)] to #[serde(tag = \"sink_type\")] is a breaking serialization change: any persisted configs that don’t include sink_type will fail to deserialize. To avoid breaking existing users/data, consider a backward-compatible deserialization strategy (e.g., an #[serde(untagged)] wrapper that accepts both the new tagged format and the legacy untagged format, or a custom Deserialize that infers the variant when sink_type is missing).

Copilot uses AI. Check for mistakes.
Comment on lines +75 to +76
let client = get_http_client();
let trigger_url = format!("{}/api/v1/sink/trigger/async", api_base_url);
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If API_BASE_URL is configured with a trailing slash (common in envs), this will produce a double-slash URL like https://host//api/v1/.... Please trim trailing slashes (e.g., api_base_url.trim_end_matches('/')) when building trigger_url (similar to how the k8s sink-trigger does it).

Copilot uses AI. Check for mistakes.
dirs-next = "2.0.0"
regex = "1.11.3"
rig-core = {version="0.29.0", features = ["rmcp"]}
copilot-sdk = { git = "https://github.com/copilot-community-sdk/copilot-sdk-rust.git" }
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The git dependency is not pinned to a specific rev/tag, which makes builds non-reproducible and can unexpectedly break when the upstream repo changes. Please pin copilot-sdk to a specific commit SHA (or a semver tag if available) for deterministic builds.

Suggested change
copilot-sdk = { git = "https://github.com/copilot-community-sdk/copilot-sdk-rust.git" }
copilot-sdk = { git = "https://github.com/copilot-community-sdk/copilot-sdk-rust.git", rev = "73fe271" }

Copilot uses AI. Check for mistakes.
Comment on lines +29 to +31
## Setting Up GitHub Copilot

To use FlowPilot with GitHub Copilot, you need to install and configure the GitHub Copilot CLI.
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Copilot CLI installation commands and the hardcoded model list are likely to become inaccurate quickly (and may already differ by platform/provider). Consider linking to the official Copilot CLI install docs and describing model selection as 'choose from the models available in the UI' rather than enumerating specific model names.

Copilot uses AI. Check for mistakes.
Comment on lines +47 to +63
Choose your preferred installation method:

#### macOS and Linux (Homebrew)
```bash
brew install copilot-cli
```

For the prerelease version:
```bash
brew install copilot-cli@prerelease
```

#### Windows (WinGet)
```powershell
winget install GitHub.Copilot
```

Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Copilot CLI installation commands and the hardcoded model list are likely to become inaccurate quickly (and may already differ by platform/provider). Consider linking to the official Copilot CLI install docs and describing model selection as 'choose from the models available in the UI' rather than enumerating specific model names.

Suggested change
Choose your preferred installation method:
#### macOS and Linux (Homebrew)
```bash
brew install copilot-cli
```
For the prerelease version:
```bash
brew install copilot-cli@prerelease
```
#### Windows (WinGet)
```powershell
winget install GitHub.Copilot
```
To install the GitHub Copilot CLI, follow the official installation guide for your operating system:
- [GitHub Copilot in the CLI installation guide](https://docs.github.com/copilot/github-copilot-in-the-cli/github-copilot-in-the-cli)
The guide provides the most up-to-date installation commands and options for macOS, Linux, and Windows.

Copilot uses AI. Check for mistakes.
@felix-schultz felix-schultz merged commit 9fbea62 into dev Feb 9, 2026
7 of 14 checks passed
@felix-schultz felix-schultz deleted the epic/103-create-web-app branch February 9, 2026 00:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Create Web App

3 participants