nfdi4plants/Swate
50.2
Adequate · 3 October 2026
90.7k
lines of production code
F#
primary language
2
measurements over time
What this system is
Swate is a desktop and web application for managing research data through ARC files, providing a spreadsheet-like interface for annotation, metadata editing, and ontology term search. It integrates with Git and DataHUB for version control and authentication, supporting features like provenance grouping, JSON export, and interactive graph visualizations. The system is built with F\# and React, offering both an Electron client and an Excel add-in to facilitate structured data management in biological research contexts.
How it got here
2020–2024 — Swate application architecture and feature expansion
36 changes.
The project underwent a major architectural overhaul, migrating to .NET 10 and restructuring the client and server into modular, versioned components with a Neo4j backend. This period saw the introduction of core features including hash-based SPA routing, ontology term search, and a redesigned spreadsheet interface with DataMap support. Additionally, the codebase expanded to include new UI pages for building blocks, file picking, and JSON export, alongside comprehensive test coverage and Office interop improvements.
2025–2026 — Electron desktop application and component library
94 changes.
This period focused on establishing the foundational architecture for the Swate desktop application using Electron, including IPC bridges, version control integration, and state management. Simultaneously, a comprehensive React component library was built and published, providing reusable UI primitives and complex widgets for the new desktop interface.
Features
Add ArcVaultActions component for managing ARC vault paths
Introduces a new ArcVaultActions component that displays an ARC vault name and provides a popover menu with actions to copy the local path or open the folder in the file explorer. The component includes Storybook stories to demonstrate default rendering and verify that the copy and open-folder callbacks are triggered correctly.
src/Components/src/Composite/ArcVaultActions · high confidence
Add Building Block dropdown widget for composite headers
Users can now configure composite table columns via a new Building Block widget. This component provides a dropdown interface to select header types (such as Parameter, Factor, Characteristic, Comment, and Protocol details) and input/output types (Source, Sample, Material, Data, or FreeText). It includes controls for entering specific values like ontology terms, free-text comments, or IO type descriptions, enabling the construction of structured composite data views.
src/Components/src/Composite/Widgets/BuildingBlockWidget · high confidence
Add CardGrid and Navbar primitive components
Introduced two new primitive UI components: CardGrid, which provides a container for displaying a grid of action buttons with optional titles and leading elements, and Navbar, which offers a flexible navigation bar with left, middle, and right slots. Both components are implemented in F\# using Feliz, include Storybook stories for interactive documentation and testing, and are published as part of the Swate.Components package.
src/Components/src/Primitive/CardGrid, src/Components/src/Primitive/Navbar · high confidence
Add Electron provenance grouping reader
A new ProvenanceGroupingReader module has been added to the Electron main process to handle provenance data retrieval. This component exposes functions to list table selections across studies, assays, and runs, and to load specific provenance tables, converting internal ARC models into the shared DTOs required for IPC communication.
src/Electron/src/Main/Provenance · high confidence
Add F\# bindings for Cytoscape.js
Introduces a new F\# module (Cytoscape.fs) that provides type-safe bindings for the Cytoscape.js library. This includes definitions for core interfaces (ICytoscape, ILayout), helper functions to create nodes and edges with positions and data, and a native import to instantiate the Cytoscape graph, enabling the client to render interactive network visualizations.
src/Client/JsBindings · high confidence
Add JSON export and import widgets
New React components for exporting and importing ARCtrl data as JSON files have been added. The JsonExport widget allows users to select a supported format and download the current project state, while the JsonImport widget supports both file picker and direct file input methods to load JSON data back into the application, handling parsing and format selection automatically.
src/Components/src/Composite/Widgets/JsonExport, src/Components/src/Composite/Widgets/JsonImport · high confidence
Add NoteSearch composite component with fuzzy and exact-match filtering
A new NoteSearch composite component is introduced, providing a user interface for searching notes with fuzzy matching (via Fuse.js) and exact-match filtering across title, content, and tags. The component includes a search input, a dropdown filter for selecting search fields, and a results list displaying note previews, dates, and tags. Example data and Storybook stories are included to demonstrate the component's functionality.
src/Components/src/Composite/Notes/NoteSearch · high confidence
Add Primitive Dropdown component
Introduces a new primitive Dropdown component (src/Components/src/Primitive/Dropdown) that manages open/close state, renders a toggle and a content menu, closes on click-away or when a menu item is clicked (configurable via closeOnClick), and applies specific styling including a z-index of 99. Includes Storybook stories demonstrating basic usage and interaction testing.
src/Components/src/Primitive/Dropdown · high confidence
Add Primitive Popover component with Floating UI integration
Introduced a new Popover primitive component in the Swate Components library, providing a context-driven API for building accessible, floating dialogs. The implementation leverages Floating UI for positioning and interaction management, exposing sub-components such as Popover, Trigger, TriggerRender, Content, Heading, Description, and Close. It supports both controlled and uncontrolled open states, modal and non-modal modes, and includes accessibility features like focus management and ARIA dialog roles, with Storybook stories demonstrating basic, controlled, custom trigger, and modal usage patterns.
src/Components/src/Primitive/Popover · high confidence
Add Settings Page component with theme and note folder configuration
The SettingsPage component is now available, providing users with controls to select the application theme (including an 'Auto' option that follows system settings) and toggle the automatic creation of a /notes folder when an ARC is opened or created. The page also includes a section for Term Search Configuration and is wrapped with necessary providers for theme and query context.
src/Components/src/Page/SettingsPage · high confidence
Add StringSubmissionDialog component for validated text input
Introduces a new \StringSubmissionDialog\ component within the Dialog primitive that provides a pre-built UI for collecting and validating a single string value. This component handles local state for the input field, displays validation errors, prevents duplicate submissions via a busy state, and supports custom validation logic, submit/cancel actions, and keyboard shortcuts (Enter to submit).
src/Components/src/Primitive/Dialog · high confidence
Add interactive tutorial overlay component
Introduces a new \TutorialOverlay\ component that guides users through application features using a spotlight effect and an explanation card. The component supports two step types: explanation steps that block interaction outside the spotlight, and task steps that highlight target elements while keeping the UI interactive. It includes a sidebar for step navigation, handles checkpoint-based state restoration to ensure tasks can be repeated, and allows completion via manual advancement, event detection, or custom conditions.
src/Components/src/Composite/TutorialOverlay · high confidence
Add low-level Fable bindings for Node.js APIs
The application now includes a new set of Fable bindings in the Main.Bindings module to interface directly with Node.js core modules. These bindings provide typed access to the file system (fs) for synchronous and asynchronous operations like reading, writing, and renaming files; path manipulation utilities (join, resolve, dirname); Node.js process and buffer handling; file system event watching via Chokidar; and Promise utilities such as race and AbortController support. This enables the Electron main process to perform native file system tasks and manage asynchronous operations more robustly.
src/Electron/src/Main/Bindings · high confidence
Add primitive button components with loading and tooltip support
Introduces a new set of primitive button components in the Buttons module: DeleteButton and CircularExitButton for destructive and exit actions, CollapseButton for toggleable UI sections, and QuickAccessButton which includes integrated tooltip support via FloatingUI. These components provide consistent styling and accessibility features, such as aria labels and keyboard navigation, for common interaction patterns.
src/Components/src/Primitive/Buttons · high confidence
Add primitive icon components and DaisyUI type definitions
The Primitive component library now includes a new Icons module providing a suite of SVG-based UI icons (such as FileImport, FileExport, Save, Delete, and Cog) rendered via Feliz, and a Types module defining F\# string enums for DaisyUI styling properties including size, color, and tooltip position.
src/Components/src/Primitive · high confidence
Add standalone LoadingSpinner primitive component
A new LoadingSpinner component is introduced in the Primitive layer, allowing users to display a loading indicator with optional text, size (XS through XL), and color variants (Primary, Secondary, Accent, Warning, Error, Info, Success). The component is implemented in F\# using Feliz and styled with DaisyUI classes, and includes Storybook stories to demonstrate its usage and verify rendering.
src/Components/src/Primitive/LoadingSpinner · high confidence
Add state management types and coordinate helpers
New types have been introduced to support state management and grid operations within the components library. KeyedState provides a mechanism to associate state with a specific key, allowing downstream components to validate state validity based on key changes. StateContext and StateUpdaterContext define structures for managing state and state updates. Additionally, CellCoordinate and CellCoordinateRange types with helper functions (count, toArray, contains) have been added to support coordinate-based logic.
src/Components/src/Types · high confidence
Added F\# bindings for DndKit drag-and-drop library
A new F\# binding file (DndKit.fs) has been added to expose the @dnd-kit/core and @dnd-kit/sortable JavaScript libraries for use in the client application. This provides React components (DndContext, SortableContext) and hooks (useSortable, useDroppable, useSensor) along with utility functions (arrayMove) and sensors (PointerSensor, KeyboardSensor), enabling the implementation of drag-and-drop interfaces within the shared components.
src/Client/SharedComponents/JsBindings · high confidence
Automated version file updates during release
The build process now automatically updates version numbers and release dates across multiple project files (server and client Version.fs, .fsproj files, and package.json files) during the release pipeline, ensuring consistent versioning without manual intervention.
build/IO · high confidence
Automatic notes folder creation and search indexing
The application now automatically creates an optional 'notes' folder within the ARC root when the corresponding setting is enabled, populating it with a README file. It also introduces a new search capability that indexes Markdown files in this folder, parsing YAML frontmatter to extract titles, dates, and tags for display in the search results.
src/Electron/src/Main/Notes · high confidence
DataMap table gains full clipboard and context menu support
The DataMap table component now supports standard spreadsheet-like operations, including Copy, Cut, Paste, Fill Column, Clear, and Delete Row via a unified context menu and keyboard shortcuts (Ctrl+C/X/V). The implementation handles structured cell data (terms, units, free text, and file references) as well as plain tab-separated text, automatically expanding rows when pasting content that exceeds the current table height. A new Details modal allows users to inspect and edit individual cell properties, such as term sources and accessions.
src/Components/src/Composite/DataMapTable · high confidence
Establishes IPC bridges for Electron preload script
The Electron preload script now explicitly registers two-way and one-way IPC bridges for a comprehensive set of APIs, including ArcVaults, Version Control, GitLab, Authentication, Templates, Validation Packages, and various renderer-side APIs for file trees, imports, and unsaved changes. This change enables the renderer process to communicate with the main process for these specific features.
src/Electron/src/Preload · high confidence
Initial Cytoscape graph visualization for term trees
The Cytoscape page now renders an interactive graph visualization of term trees using the Cytoscape.js library. The implementation constructs nodes and edges from the term tree data, applies specific styling (such as highlighting the target accession in red and coloring 'is\_a' relationships in orange), and initializes the view with a cose layout centered on the target node. While the core graph rendering logic is in place, the Elmish update module for handling messages and API calls remains commented out, indicating that the interactive data fetching and state management are not yet fully wired up.
src/Client/Pages/Cytoscape · high confidence
Initial Electron application scaffolding for Swate
This change introduces the foundational structure for the Swate desktop application using Electron and Vite. It establishes the build configuration via \forge.config.js\, defining the executable name, platform-specific icons, and packaging targets (Squirrel, DMG, ZIP, DEB, RPM). The setup integrates a F\#-to-JavaScript compilation pipeline (Fable) for the main and preload processes, while the renderer leverages React and Tailwind CSS. Additionally, it configures Electron security fuses to disable Node.js integration in the renderer and enforces ASAR integrity, and includes a post-package hook to ad-hoc sign macOS ARM64 builds.
src/Electron · high confidence
Initial Storybook configuration for component documentation
Storybook is now configured for the Components library, enabling developers to view and interact with UI components in isolation. The setup includes a categorized story structure (Primitive, Composite, and Page Components), theme switching support via data attributes (light/dark modes), and integration with Vitest for testing. Mocks for Node.js file system and path modules are included to ensure compatibility within the browser-based Storybook environment.
src/Components/.storybook · high confidence
Initial implementation of API client modules for GitLab, Swate, and TIB services
This change introduces the foundational API client layer for the application, adding four new F\# modules: GitLabApi.fs, Helper.fs, SwateApi.fs, and TIBApi.fs. GitLabApi.fs defines the data transfer objects (DTOs) and error handling types for interacting with the GitLab REST API, including support for project exploration, pagination, and user authentication details. SwateApi.fs and TIBApi.fs establish the client proxies for the internal Swate Ontology and Template APIs, and the external TIB Terminology API respectively, utilizing Fable.Remoting and Fable.Fetch for HTTP communication. The Helper.fs module provides shared utilities for constructing query parameters used across these API calls.
src/Components/src/Api · high confidence
Initial project scaffolding and repository configuration
The repository is initialized with core configuration files including a MIT license, a .zenodo.json metadata file for software citation, and a .fantomasignore to exclude transpiled Fable modules from formatting. Project structure is defined by new .sln files (Swate.sln, Nuget.sln) and a Directory.Build.props for centralized F\# dependency management. Build and development workflows are established via build.cmd, build.sh, and global.json, while contributor guidelines are documented in CONTRIBUTING.md and AGENTS.md.
(repo-wide) · high confidence
Initial release of Swate.Components library with comprehensive UI primitives and composites
The Swate.Components library is now available for installation via npm (\@nfdi4plants/swate-components\) and NuGet (\Swate.Components\), providing a unified set of UI components for both JavaScript and .NET (F\#) applications. The library exposes a wide range of Primitive components (such as BaseModal, ComboBox, ContextMenu, Dropdown, and various buttons) and Composite components (including Actionbar, AccountManager, AnnotationTable, FilePickerWidget, SortableList, and TermSearch), along with full-page views like ArcFileEditor and DataHubBrowser. Styling is handled via an integrated Tailwind CSS and DaisyUI theme (\swate-components.css\), which users import alongside the component library to ensure consistent theming across their applications.
src/Components/src · high confidence
Introduce Actionbar composite component with overflow menu support
Added a new Actionbar composite component that displays a configurable number of primary action buttons and automatically moves excess buttons into a context menu triggered by a 'Show more options' button. The component supports customization of button size, tooltip positioning, and CSS classes, and includes Storybook stories demonstrating interactive usage and keyboard navigation for the overflow menu.
src/Components/src/Composite/Actionbar · high confidence
Introduce AnnotationTable component with context menu and clipboard support
The AnnotationTable component is introduced in the Composite layer, providing a spreadsheet-like interface for managing annotation data. It features a context menu that supports standard operations such as copy, cut, paste, clear, and delete rows or columns. The component integrates with the system's clipboard codec to handle plain text and structured cell payloads, ensuring that data selectors and unit terms are preserved during copy-paste operations. Additionally, it includes a confirmation modal for table deletion and Storybook stories to demonstrate cell editing, term search, and context menu interactions.
src/Components/src/Composite/AnnotationTable · high confidence
Introduce ArcSelector component for managing recent ARC paths
Added the ArcSelector composite component, which provides a dropdown interface for selecting from a list of recent ARC (Arc) pointers. The component displays the currently open ARC name, truncates long names without resizing the toggle button, and closes the dropdown upon selection. It supports an optional action bar integration and includes a delete button for removing recent entries, with a loading state handled via a disabled button and spinner.
src/Components/src/Composite/ArcSelector · high confidence
Introduce BaseModal primitive component with accessible structure
A new BaseModal component is added to the Swate.Components.Primitive library, providing a structured, accessible modal dialog. It includes sub-components for header, description, actions, content, and footer, and leverages Floating UI for positioning, focus management, and dismissal. The implementation ensures proper ARIA attributes (aria-labelledby, aria-describedby) and supports scroll locking and focus restoration, offering a reusable foundation for modal interactions within the application.
src/Components/src/Primitive/BaseModal · high confidence
Introduce Data Annotator page component
Added the main page component for the Data Annotator feature, which renders a sidebar layout containing the core annotation logic. The component handles displaying an ArcFile for annotation or showing an error message if the file cannot be processed, and integrates with the existing sidebar container for navigation.
src/Client/Pages/DataAnnotator · high confidence
Introduce DataAnnotator widget for CSV/TSV preview and target selection
A new DataAnnotator widget has been added to the Composite Widgets library, enabling users to load and preview CSV or TSV files as selectable tables. This component allows users to click column headers, row numbers, or individual cells to define annotation targets, which are then highlighted and included in submissions. It supports both Table and DataMap annotation destinations with Replace and Append write modes, and includes helper logic for parsing data files, managing target selectors, and applying annotations to the underlying data structures.
src/Components/src/Composite/Widgets/DataAnnotator · high confidence
Introduce DataHUB authentication with multi-account support and token expiration tracking
The Electron app now supports authenticating against DataHUB (GitLab) instances, allowing users to store and switch between multiple accounts. The new AuthService manages active account selection and token retrieval, while SecureAuthStore handles persistent storage of encrypted tokens and account metadata. Users will see their token expiration dates and status (valid, expiring, or invalid) displayed in the UI, and the system enforces HTTPS-only connections for DataHUB endpoints. This change replaces the previous single-account model with a more robust multi-account architecture that persists account state across sessions.
src/Electron/src/Main/Auth · high confidence
Introduce DataHub Browser for GitLab repository exploration
A new DataHub Browser page component has been added, enabling users to explore and filter GitLab repositories. The interface supports browsing by tabs (All, Your Repos, Most Starred, Your Groups), searching by keyword, and sorting by criteria such as last updated, date created, name, or stars. Users can filter results by specific groups (organisations) and navigate paginated results. The component includes a fallback mechanism for broken repository avatar images, displaying initials instead, and restricts access to personal and group-specific tabs for unauthenticated users.
src/Components/src/Page/DataHubBrowser · high confidence
Introduce DataMap view and generic cell access in Spreadsheet Controller
The Spreadsheet Controller now supports a new DataMap view alongside the existing Table view. This is enabled by new modules (Generic, DataMap, BuildingBlocks, Table, Cells) that provide generic get/set cell logic, allowing operations to target either the active table or the DataMap depending on the current view. Users can now manage DataMap contexts (adding/deleting rows, updating data context) and perform data annotation within this new view, while table-specific operations like adding/removing tables, joining tables, and inserting ontology terms remain available in the Table view.
src/Client/Spreadsheet/Controller · high confidence
Introduce FileExplorer component with Git LFS support and context menu actions
The FileExplorer page now features a new component that supports Git LFS operations, including downloading files, freeing local copies, and marking/unmarking files as LFS-tracked. Users can interact with files via a context menu that offers actions like opening, copying paths, and expanding/collapsing directories. The component also handles LFS busy states, preventing renaming or deletion during downloads, and displays status pills for LFS activity. Additionally, it supports creating generic files and folders at the ARC root via right-click, and provides options to open files with default applications or open folder locations.
src/Components/src/Page/FileExplorer · high confidence
Introduce FolderedDraggableList component for organizing draggable items
A new FolderedDraggableList component is available for grouping and reordering items within named folders. Users can drag items between folders, accept external drops into the list, and customize folder and item colors. The component supports item labels, badges, tooltips, and disabled states, providing a structured way to manage collections of draggable elements.
src/Components/src/Composite/FolderedDraggableList · high confidence
Introduce Git Sidebar component for version control operations
A new Git Sidebar component has been added to the application, providing users with a dedicated interface for managing Git operations. This component displays the current branch status, tracks ahead/behind counts, and lists changed files with specific status indicators (Added, Modified, Deleted, Renamed, Untracked, Conflict) using shorthand letters and color-coded tones. It supports core version control actions including fetching, pulling, pushing, committing (selection or all), discarding changes, and creating or switching branches. The UI also includes an advanced actions panel for LFS settings (large file download preferences, auto-track thresholds, cache pruning, storage deduplication), an open remote repository button, and a progress indicator that shows real-time output and percentage for ongoing Git operations. Conflicted files are handled distinctly, with discard buttons hidden for conflicted rows to prevent accidental loss.
src/Components/src/Page/GitSidebar · high confidence
Introduce Notes Editor with Study/Assay assignment and Markdown export
The Notes Editor component now allows users to create new notes or assign them to existing Studies or Assays. The editor collects a title, date, optional ontology tags, and markdown body, then formats the output as a Markdown file with YAML frontmatter. When assigning to an existing target, users select a Study or Assay via a modal, and the note is saved to the corresponding protocols folder; creating a new root note saves it under a date-stamped folder. The component includes validation for required fields and sanitizes protocol names for safe file paths.
src/Components/src/Composite/Notes/Editor · high confidence
Introduce Primitive ComboBox component
Added a new primitive ComboBox component (ComboBox.fs) with a Storybook story (ComboBox.stories.tsx) and associated type definitions (Types.fs). The component provides a searchable, filterable dropdown list with customizable rendering for items, containers, and visual placeholders, supporting keyboard navigation, focus management, and integration with Floating UI for positioning.
src/Components/src/Primitive/Blankslate, src/Components/src/Primitive/ComboBox · high confidence
Introduce Validation Package Browser component
Added a new ValidationPackageBrowser component that allows users to browse, search, and filter available validation packages by name, summary, description, tags, and authors. The interface displays package details including version, authors, and release date, and enables users to select packages for their configuration. It highlights packages with older versions available for update and supports pagination for large lists. The component includes logic to compare local configuration versions against available package versions and provides a submit mechanism to apply changes.
src/Components/src/Page/ValidationPackageBrowser · high confidence
Introduce Workspace component with tab management, splitting, and drag-and-drop
The Workspace component now supports a fully interactive layout with tabs, split panes, drag-and-drop reordering, and context menus. Users can open multiple tabs, drag them to reorder within a pane, or drag them to pane edges to split the workspace horizontally or vertically. The middle mouse button on a tab closes it, and a right-click context menu offers options to close individual tabs, others, all tabs, or all tabs in the current pane. The layout supports unlimited nesting of splits, and the component integrates with DndKit for robust drag-and-drop interactions.
src/Components/src/Composite/Workspace · high confidence
Introduce primitive ContextMenu component with keyboard navigation and typeahead
A new primitive ContextMenu component is available in the Swate Components library, providing a floating menu triggered by right-click events. The component supports keyboard navigation (arrow keys), typeahead search (typing to jump to items), and accessibility features like ARIA roles and labels. It allows customization of menu items with text, icons, keyboard shortcuts, and dividers, and handles edge cases such as clipping boundaries and preventing item activation on mouse release.
src/Components/src/Primitive/ContextMenu · high confidence
Introduce renderer state management contexts
The renderer now uses a set of new React contexts to manage application state, replacing previous patterns. AppStateContext exposes the current ARC root path, AuthStateContext handles authentication state and account updates via IPC, and FileStateContext manages the file tree, selection, and external file imports. GitStateContext and GitWorkflow provide the core version control state machine and operations (clone, fetch, pull, push, commit, merge), while LfsActivityContext tracks large-file operations to keep UI rows busy during transfers. PageStateContext manages the current view state. These contexts centralize state and provide hooks for components to access and update this data.
src/Electron/src/Renderer/Context · high confidence
Introduces ArcVault as the central manager for ARC lifecycle and file watching
The application now uses a new ArcVault module to manage the lifecycle of opened ARCs, handling file watching, merge queuing, and import coordination. This change introduces a dedicated queue for serializing ARC merges to prevent race conditions, implements a busy-writing suppression mechanism to avoid watcher conflicts during saves, and adds a file import coordinator with authorization checks to ensure safe external file imports. It also includes helpers for normalizing watcher events and managing window-specific state, replacing previous ad-hoc handling with a structured, per-vault approach.
src/Electron/src/Main/ArcVault · high confidence
Introduces IndexedDB-backed local history and new state modules for ARCitect, Data Annotator, and Cytoscape
The client state layer has been restructured to support persistent local history and new application features. A new IndexedDB module provides low-level database operations, which are utilized by the LocalHistory module to store and retrieve compressed spreadsheet history (using pako for GZIP compression) via session and local storage keys. New state modules have been added to manage specific features: ARCitect (handling file initialization, saving, and path requests), DataAnnotator (managing file parsing and header toggling), CytoscapeState (tracking term trees), and OfficeInteropState (managing annotation table workflows). The Spreadsheet state now integrates with these new modules, supporting the new history persistence and expanded message types for imports, exports, and table manipulations.
src/Client/States · high confidence
Introduction of Swate Ontology API v3 with enhanced search capabilities
The API layer now exposes version 3 of the Ontology API, introducing new endpoints for searching ontology terms by accession or name, retrieving terms by ID, and finding child terms under a specific parent. The search functionality supports batch queries, allows filtering by source ontology, and automatically adjusts search modes (Exact vs. PerformanceComplete) based on query length. Additionally, the API includes OpenAPI documentation generation and a dedicated error handler for better diagnostics.
src/Server/Api · high confidence
New ArcFileEditor component with unified view management and widget integration
The ArcFileEditor page component has been introduced to manage the editing interface for ARC files, consolidating navigation and content rendering. It supports three distinct views—Table, DataMap, and Metadata—switchable via footer tabs that include drag-and-drop reordering for tables. The editor integrates a suite of interactive widgets accessible via the navbar, including Building Block, Template, File Picker, Data Annotator, and JSON Import/Export tools. A new EmptyTableView provides guided entry points for creating tables from scratch, importing templates, or reusing output columns from existing tables. The component also handles lazy loading of heavy widgets and manages state updates for tables and data maps within the ARC file structure.
src/Components/src/Page/ArcFileEditor · high confidence
New ArcMerge library for handling ARC file operations and merging
A new ArcMerge library has been introduced to manage ARC file additions, entity references, and merge logic. This includes \ArcAddExtensions\ for preparing and committing contracts when adding assays, studies, runs, workflows, and datamaps to an ARC, ensuring proper rollback on failure. \ArcEntityRefHelper\ and \Types\ define how file paths are parsed into entity references (e.g., Assay, Study, DataMap) and event types (Add, Unlink, Change). \ArcMergeLibraryExtensions\ provides the core merge logic, applying add/change/unlink events to local ARC entities while preserving datamap labels and handling investigation field synchronization.
src/Electron/src/Main/ArcMerge · high confidence
New ArcTable and DataMap components in SpreadsheetView
The SpreadsheetView location now includes two new component files, ArcTable.fs and DataMap.fs. ArcTable.fs wraps the ARCtrl.ArcTable control, handling the dispatch of table updates via SpreadsheetMsg. DataMap.fs wraps the DataMapTable control, managing the retrieval of the current DataMap and dispatching updates. These components serve as the UI layer for the active spreadsheet table and the data mapping configuration respectively.
src/Client/MainComponents/SpreadsheetView · high confidence
New Building Block sidebar for adding and converting annotation columns
A new sidebar interface has been added to the Building Block page, allowing users to create and manage annotation columns directly. The \BuildingBlockView\ component now hosts a \SearchComponent\ that integrates term search for ontology annotations, enabling users to define column headers (such as Parameters, Factors, or Protocol Types) and body cell types (Terms, Units, or Free Text). Additionally, when running inside Excel, a \CellConvertComponent\ is exposed, providing a 'Refresh' and 'Convert' workflow to transform existing Excel cell data into the new building block structure. This replaces previous ad-hoc addition methods with a unified, searchable, and validated column creation flow.
src/Client/Pages/BuildingBlock · high confidence
New DTOs for Note Search and Provenance Grouping IPC
Added new data transfer objects in the shared Electron layer to support inter-process communication for note search and provenance grouping features. The NoteSearchDto enables serializing note metadata (path, title, date, tags, content) for search results, while the ProvenanceGroupingDto defines the structure for provenance data (scopes, selections, property values, and model connections) to ensure clone-safe transmission between processes.
src/Electron/src/Swate.Electron.Shared/DTOs · high confidence
New File Explorer sidebar with ARC file management
The left sidebar now features a dedicated File Explorer component that displays the ARC file tree, allowing users to create, rename, and delete ARC entities (Studies, Assays, Workflows, Runs) and generic files or folders. Users can manage DataMaps by adding or deleting them via the context menu, import external files, and open files with default applications or in the system file explorer. The interface includes a busy state for Git LFS operations (downloads/frees) that locks related rename and delete actions, and provides specific sorting for root ARC elements like 'studies' and 'assays'.
src/Electron/src/Renderer/Components/LeftSidebar/FileExplorer · high confidence
New File Picker page for selecting and managing file lists
A new FilePickerView component has been added to the client application, providing a user interface for selecting files and directories. The view supports multiple input methods: on the ARCitect host, users can pick individual files or entire directories via dedicated buttons; on other hosts, a standard file input is used. The interface allows users to sort the selected file list alphabetically (ascending or descending), remove specific files, and insert the final list of file names into the active spreadsheet table at the currently selected cell range.
src/Client/Pages/FilePicker · high confidence
New Git Diff and Merge Conflict viewers for file comparisons
The Git Comparison page now includes dedicated viewers for displaying file diffs and resolving merge conflicts. The Git Diff Viewer renders side-by-side word-level differences with virtualized scrolling for large files and automatically detects whether a file was added, deleted, or modified. The Git Merge Conflict Viewer allows users to resolve conflicts by choosing between incoming and current changes, with support for undoing resolutions and handling multiple conflict blocks within a single file.
src/Components/src/Page/GitComparison · high confidence
New Info and Privacy Policy pages added
The Info section now includes a dedicated Privacy Policy page and an updated About view. The new Privacy Policy page details data collection, user rights under GDPR, and controller contact information. The About view has been refreshed to include an introduction to Swate, contact links for DataPLANT and X (@nfdi4plants), GitHub repository access, and a new section linking to the IOntologyAPIv3 documentation.
src/Client/Pages/Info · high confidence
New JavaScript bindings for clipboard, drag-and-drop, floating UI, and virtualization
Added Fable bindings for several JavaScript libraries to enable advanced UI interactions: Clipboard API support for reading and writing text and HTML; DndKit bindings for drag-and-drop and sortable lists; Floating UI bindings for positioning popovers and tooltips; Navigator bindings for accessing the clipboard; and TanStack Virtual bindings for efficient rendering of large lists.
src/Components/src/JsBindings · high confidence
New Landing page wizard for creating Studies and Assays
The Landing page now features a new wizard interface that allows users to create either a Study or an Assay. The flow begins with required metadata fields (Title, Description) and optional fields for people, comments, and main text. Users can then select their target type, which reveals specific fields: Studies include publications, dates, and design descriptors, while Assays include measurement, technology, and platform types. The component handles validation, identifier resolution (auto-generating from the title if needed), and submits a payload containing the ArcFile and optional protocol intent.
src/Components/src/Page/Landing · high confidence
New Left Sidebar component with file import status and navigation
A new \Main.fs\ component has been added to the \LeftSidebar\ location, serving as the container for the application's left navigation panel. It renders either the File Explorer or Git sidebar based on the current target page and includes a \FileImportStatusNotice\ overlay. This notice displays real-time progress (Importing, Finalizing, Cancelling) for file imports and provides a 'Cancel' button to abort the operation, handling errors via the global error modal context.
src/Electron/src/Renderer/Components/LeftSidebar · high confidence
New MainContent component architecture with dedicated view targets
The renderer's main content area has been refactored into a new \Main.fs\ dispatcher that routes to specific target components based on the current page state. This introduces dedicated views for editing ARC files (\ArcFilePreviewTarget\), browsing the DataHub (\DataHubBrowserTarget\), managing notes (\NotesDraftTarget\, \NotesSearchTarget\), handling git conflicts (\GitMergeConflictTarget\, \GitFileChoiceConflictTarget\, \GitDiffTarget\), and editing markdown (\MarkdownEditorTarget\). The layout now supports lazy-loading for heavy components like settings and provenance grouping, and includes new targets for empty selections, errors, and unsupported file types.
src/Electron/src/Renderer/Components/MainContent · high confidence
New Markdown editor with toolbar plugins and Mermaid diagram support
The MarkdownText component now includes a rich text editor (TextInputWithMarkdown) featuring a toolbar with built-in formatting commands and a plugin system. Users can insert checklist steps, add ontology references (e.g., accession codes), and upload images via a dedicated modal interface. The preview mode now renders Mermaid diagrams from code blocks and sanitizes HTML content. A plugin registry manages default and custom toolbar plugins, while a prompt modal handles user input for these actions.
src/Components/src/Composite/MarkdownText · high confidence
New Playground environment for component demonstration
A new playground application has been added to the Components project, providing a centralized environment to preview and test various UI components. The entry point (main.tsx) initializes a React app that renders a collection of demo containers, including TermSearch (with TIB API integration and configuration providers), AnnotationTable, ContextMenu, TemplateFilter, ComboBox, BaseModal, DataMapTable, FileExplorer, WidgetController, LandingWizard, MarkdownEditor, AuthenticationButton, and DataHubBrowser. This allows developers and users to interact with these components in isolation before integrating them into the main application.
src/Components/playground · high confidence
New Settings page with theme switching and autosave control
The Settings page now includes a Theme selector allowing users to switch between visual themes (Sunrise, Finster, Planti, Viola, Amaze, and Auto) with animated icons, and an Autosave toggle that lets users disable automatic local history saving.
src/Client/Pages/Settings · high confidence
New SortableList component and FilePicker widget integration
A new SortableList component has been introduced, enabling users to reorder, move up/down, and remove items via drag-and-drop or buttons, with support for custom row rendering. The FilePicker widget now leverages this SortableList to display picked file paths, allowing users to sort, reorder, and manage file selections before inserting them into table or DataMap cells.
src/Components/src/Composite/Widgets · high confidence
New Template Browser component with selective import capabilities
The TemplateBrowser composite component has been introduced to allow users to browse, filter, and select templates for import. It features a cached template list that refreshes automatically every hour, a table-based display for selecting multiple templates, and a detailed import modal. Within the modal, users can choose an import mode (Headers, With Unit, or With Values) and configure per-template actions: importing as a new table, appending to the active table, or skipping the template entirely. Users can also selectively include or exclude specific columns from each template before confirming the import.
src/Components/src/Composite/TemplateBrowser · high confidence
New ThemeSelector component with six theme options
Added a new ThemeSelector composite component that allows users to switch between six visual themes: Auto, Sunrise (light), Finster (dark), Planti, Viola, and Amaze. The ThemeProvider manages the current theme state using local storage (key 'swate-theme-ctx') and applies the selection via a 'data-theme' attribute on the document root, while the ThemeSelector UI presents a dropdown with corresponding animated icons for each option.
src/Components/src/Composite/ThemeSelector · high confidence
New build tooling for GitHub Actions and Release management
Added new F\# modules in build/Tools to support the release pipeline: GHActions.fs provides helpers to set GitHub Actions outputs (e.g., version, skip flags); Git.fs adds utilities to list tags and create/push tags; GitHub.fs implements interactions with the GitHub API to create, retrieve, and update releases, including handling assets by deleting and re-uploading existing ones.
build/Tools · high confidence
New client utility modules for debouncing, throttling, and inter-host messaging
Added new utility modules in src/Client/Util to support client-side interaction patterns. Helper.fs introduces DebounceStorage, debounce, debouncel, throttle, and throttleAndDebounce functions to manage timing-sensitive UI updates and prevent excessive processing. MessageInterop.fs implements a cross-window messaging system using postMessage, allowing the client to send requests to other browser contexts (like iframes or popups) and handle responses with timeout support and error handling. SwateHost.fs defines an enumeration for different host environments (Browser, Excel, ARCitect) and provides logic to detect the current host via query parameters, enabling environment-specific behavior.
src/Client/Util · high confidence
New component library build system and configuration
The \src/Components\ directory now includes the foundational configuration for a new React component library, introducing a Vite-based build pipeline, Storybook integration, and Vitest testing. This setup supports TypeScript declaration generation, tree-shakeable ES module output, and browser-based testing for Storybook stories. It also establishes a Tailwind CSS and DaisyUI styling foundation with custom themes (finster, sunrise, planti, viola) and a dedicated playground for local development.
src/Components · high confidence
New composite Layout component with resizable sidebars
Added a new Layout component in the Composite module that provides a main content area flanked by optional left and right sidebars. Users can toggle these sidebars via dedicated toggle buttons and resize them using draggable handles, with logic to automatically collapse sidebars or adjust the opposing sidebar to maintain a minimum main content width. The implementation includes context providers for managing sidebar state and Storybook stories demonstrating various configurations, including default open states and custom action bars.
src/Components/src/Composite/Layout · high confidence
New composite authentication component with multi-account support and token management
The authentication UI has been replaced by a new composite component that allows users to sign in with a GitLab Personal Access Token, select from supported or custom DataHUB instances, and manage multiple stored accounts. Users can now switch between accounts, remove stored accounts, and view token status indicators (invalid or expiring) with options to regenerate or refresh tokens directly from the interface. The component also displays the token expiration date and provides a link to the user's GitLab profile.
src/Components/src/Composite/Authentication · high confidence
New drag-and-drop ID system and drop-target resolution for workspace panes
The Workspace Helper now includes a new DndId module that serializes and deserializes drag-and-drop identifiers for tabs, tab bars, and edge zones, along with a DropTarget module that determines where a user drops content by resolving the target pane and closest edge direction based on pointer coordinates. These changes enable precise drag-and-drop interactions within the workspace, allowing users to split panes and rearrange tabs by dragging items to specific edge zones or tab bars.
src/Components/src/Composite/Workspace/Helper · high confidence
New footer tab context menus for spreadsheet tables and datamaps
A new FooterTabs component has been added to the ContextMenus module, introducing specific context menu interactions for spreadsheet tables and datamaps. Users can now rename or delete existing tables, add new tables, and delete datamaps directly through these footer tabs, utilizing the updated ARCtrl and Feliz libraries for rendering.
src/Client/Modals/ContextMenus · high confidence
New metadata editing components for ArcFile types
The \src/Components/src/Page/Metadata\ area now includes a complete set of new React components for editing metadata across all ArcFile types (Investigation, Study, Assay, Run, Workflow, DataMap, and Template). These components provide user-facing forms with fields for identifiers, titles, descriptions, ontology annotations, persons, publications, and comments. The implementation introduces reusable form helpers in \FormComponents\ (such as \InputSequence\ with drag-and-drop sorting, \TextInput\ with debouncing and validation, and specific inputs for ontology terms and persons) and wires them into a central \ArcFileMetadata\ component that lazily loads the appropriate metadata editor based on the file type.
src/Components/src/Page/Metadata · high confidence
New ontology term search sidebar component
Added a new TermSearchView component that provides a sidebar interface for searching ontology terms and filling selected spreadsheet cells. The view integrates with the AnnotationTable context to retrieve selected cell coordinates and dispatches commands to insert the chosen ontology annotation. It includes logic to automatically detect and insert parent terms when running within the Excel host via OfficeInterop, and features a button to apply the selected term to the active selection.
src/Client/Pages/TermSearch · high confidence
New primitive layout components for structured UI sections
Added a new set of primitive layout components (\FieldTitle\, \BoxedField\, \Section\, \Collapse\, \CollapseTitle\) to the \Swate.Components.Primitive.LayoutComponents\ namespace. These components provide reusable, styled building blocks for creating structured forms and content sections, leveraging Tailwind CSS classes for consistent styling and accessibility. The \Collapse\ component supports toggleable content areas, while \BoxedField\ offers a card-like container with optional title and description fields. Storybook stories and basic interaction tests are included to demonstrate usage and verify toggle behavior.
src/Components/src/Primitive/LayoutComponents · high confidence
New protocol template selection and import workflow
The Protocol Templates page now features a dedicated UI for browsing, selecting, and importing protocol templates. Users can view a list of templates with details such as name, organization, version, and authors, and toggle selection via checkboxes. The system caches fetched templates for one hour to reduce API calls, with a manual refresh button available. Selected templates can be imported into the current session, triggering an import configuration modal that defaults to appending all selected templates. This replaces previous ad-hoc selection mechanisms with a structured, multi-step import flow.
src/Client/Pages/ProtocolTemplates · high confidence
New provenance grouping and editing engine
This change introduces a new shared provenance grouping module that replaces the previous implementation with a source-agnostic core model. It adds a new ARCtrl converter to map ARC tables (studies, assays, runs) into a unified internal representation, enabling provenance data to be grouped by property values and displayed in a structured editor. The new system supports multi-layer sessions, allowing users to link input and output sets across different provenance sources, and provides a robust editing interface for creating, updating, and removing property values and connections with full undo/redo support via a session-based patch log.
src/Shared/ProvenanceGrouping · high confidence
New renderer helper modules for ARC, file system, and Git operations
Added a set of new helper modules in the renderer to manage ARC file operations, vault interactions, view selection, file explorer state reconciliation, file system actions, Git LFS management, and conflict/merge UI. ArcFileApiHelper and ArcVaultHelper now handle adding, saving, and opening ARC files and vaults, including automatic notes folder creation based on user settings. ArcViewHelper and ArcViewSelection manage file preview loading and view state adjustments. FileExplorerStateReconciliation handles file tree synchronization and page state resets. FileSystemHelper provides utilities for creating folders and writing files with parent folder assurance. FileTargetConflictModal introduces a UI component for handling file overwrite conflicts. GitLfsHelper exposes functions to toggle, download, and free Git LFS files. GitMergeAbandonConfirmation adds a confirmation dialog for abandoning merges.
src/Electron/src/Renderer/Components/Helper · high confidence
New shared UI components and layout utilities
This change introduces a suite of new shared components in the client's shared library to support the updated UI architecture. It adds BaseDropdown and ClickOutsideHandler for accessible, click-away-closing dropdown menus, and BaseNavbar with a 'Glow' variant for the application header. A new NavbarBurger component provides a mobile-friendly navigation menu with links to Settings, About, Privacy Policy, Docs, and Contact. Additionally, a LazyLoadTable component is added to improve performance when rendering large datasets by only rendering visible rows, and a Widgets module is introduced to persist widget position and size preferences in local storage.
src/Client/SharedComponents · high confidence
New shared library for ARC path rules, ontology search, and Git LFS management
The \src/Shared\ area now provides a comprehensive set of shared types and utilities that underpin ARC entity management, ontology integration, and file system safety. It introduces \ArcEntityPathRules\ to strictly classify and protect ARC files during rename and delete operations, preventing accidental modification of canonical files or protected metadata. The module also includes \GitLfsRules\ to enforce DataHub-compliant Git LFS tracking, ensuring ISA metadata files remain local while dataset files stay tracked. Additionally, it adds DTOs and API interfaces (\IOntologyAPIv3\, \TermQuery\, \AdvancedSearchQuery\) to support advanced term searching and ontology integration, alongside helper modules for path normalization and DataMap parent resolution.
src/Shared · high confidence
New spreadsheet UI components and widget system
The client now features a redesigned spreadsheet interface with a new empty-state view that guides users to start with templates, building blocks, or basic tables, and supports reusing output from previous tables. Table tabs in the footer are now draggable to reorder sheets, and table names can be edited inline. A new widget system allows users to add movable, resizable panels (such as Building Block, Template, File Picker, and Data Annotator widgets) to the workspace, with position and size persisted across sessions. The navbar has been updated to include quick-access history controls and widget addition buttons, while the no-file state now supports drag-and-drop file import and creation of new Arc files (Investigation, Study, Assay, Run, Workflow, Datamap, Template).
src/Client/MainComponents · high confidence
New spreadsheet import logic and data types
The spreadsheet client now includes new modules for handling file imports and internal data structures. The IO module adds support for reading Excel (.xlsx) files by detecting metadata sheet names to identify Assays, Studies, Investigations, Templates, and DataMaps, while also introducing a JSON import handler that maps various file types (Investigation, Study, Assay, Template, Run, Workflow, DataMap) and export formats (ARCtrl, Compressed, ISA, ROCrate) to their respective parsing functions. Additionally, the Types module introduces a FooterReorderData type for tracking footer reordering state and utility functions for map key operations.
src/Client/Spreadsheet · high confidence
New standalone JSON export page for annotation tables
A new standalone page has been added to allow users to export Swate annotation tables to official JSON formats. The page provides a dropdown to select between four export formats: ARCtrl, ARCtrl Compressed, ISA-JSON, and RO-Crate Metadata (including the ISA-Profile). Users can download the selected format directly from the browser, with the system automatically parsing the Excel data if running in the Office host or using the in-memory ArcFile for Browser and ARCitest hosts.
src/Client/Pages/JsonExporter · high confidence
New utility modules for component development
Added new F\# utility modules in the Util directory to support component development: DateTimeExtensions provides a helper for UTC ISO timestamps, Download implements file saving from bytes or strings, Extensions adds React property helpers (testid, data attributes) and keyboard key constants, and ReactHooks introduces custom hooks for debouncing, local storage, and event listening.
src/Components/src/Util · high confidence
New window close handling and Git LFS file management
The application now prompts users to save changes before closing the window, offering options to save, close without saving, or cancel the action via a new modal controller. Additionally, Git LFS files in the file explorer now display size and download status indicators, and users can directly download or clean up large objects from the file tree context menu.
src/Electron/src/Renderer/Components · high confidence
Architecture
Introduces Electron main-process architecture with version control session host and settings management
The Electron main process is now structured around a dedicated version control session host that manages ARC lifecycle and file tree metadata, replacing the previous direct Git implementation. This change introduces a new settings store for persisting application state (such as recent ARCs) using atomic file writes, and registers IPC handlers for version control, GitLab, vault, authentication, and template operations. The main entry point initializes the version control runtime on app ready, restores authentication state, and handles window registration and cleanup.
src/Electron/src/Main · high confidence
Introduces typed IPC contracts and shared types for Electron architecture
This change establishes the foundational communication layer between the Electron main process and the renderer by introducing a suite of new shared modules. It defines the \IPCTypes\ interface, which specifies the exact API surface for ARC vault management, file I/O operations, and provider-neutral version control (including Git LFS and conflict resolution). Additionally, it adds \AuthTypes\ for GitLab authentication flows, \FileIOTypes\ for file tree and import state structures, \VersionControlTypes\ for structured operation results and progress, and \ARCtrlJsonObject\ for ARC data serialization. These types replace ad-hoc or untyped IPC calls, ensuring that the renderer and main process share a strict contract for all cross-boundary interactions.
src/Electron/src/Swate.Electron.Shared · high confidence
Refactored Office Interop into modular helper libraries
The Office Interop logic has been restructured from a monolithic file into distinct, modular modules: \ARCtrlHelper\ (handling building block grouping and validation), \ArcTableHelper\ (managing ArcTable creation and Excel parsing), \ExcelHelper\ (providing low-level Excel range and table operations), and \InteropLogging\ (centralizing log identifiers). This change improves code maintainability and separation of concerns within the client-side Excel integration layer.
src/Client/OfficeInterop · high confidence
Refactored client update logic into modular, host-aware handlers
The client update logic has been restructured into distinct modules (ARCitect, Interface, OfficeInterop, Spreadsheet, and UpdateUtil) to separate concerns and support multiple host environments. The InterfaceUpdate module now routes messages to the appropriate backend (Excel via OfficeInterop or Browser/ARCitect via Spreadsheet) based on the detected host, enabling consistent behavior across standalone and embedded modes. New modules handle specific update flows: ARCitectUpdate manages API interactions for initialization, saving, and file requests; OfficeInteropUpdate handles Excel-specific operations like auto-fitting, ontology insertion, and template joining; and SpreadsheetUpdate manages in-memory state changes for tables, data maps, and annotations. This refactoring improves maintainability and prepares the application for enhanced multi-host support.
src/Client/Update · high confidence
Behavioural changes
1 commit (0 fixes) modifying designs
A change to existing behaviour in designs — 1 commit, 2 files.
designs · medium confidence · unverified
Automated .NET code formatting via Husky pre-commit hook
A new pre-commit hook has been added to the repository that automatically runs \dotnet fantomas\ on the codebase before each commit. This ensures that .NET source files are consistently formatted according to Fantomas standards, removing the need for manual formatting checks by developers.
.husky · high confidence
Centralized spreadsheet clipboard contract and parsing logic
This change introduces a new, centralized clipboard contract module (Actions, Contract, Types) that standardizes how spreadsheet data is captured, parsed, and mapped. For users, this ensures consistent paste behavior across different contexts, including fixes for plain numeric AnnotationTable pasting into unitized cells and correct handling of terminal newlines in plain text. The new logic also preserves target unit terms when available and unifies cross-pasting behavior, resolving previous regressions in cut/copy/paste operations.
src/Components/src/ClipboardContract · high confidence
Client application restructured with new routing, API proxies, and Tailwind styling
The client application has been reorganized into a modular structure, introducing dedicated files for API proxies (Api.fs), application entry point (App.fs), and routing (Routing.fs). This change implements a hash-based SPA routing system that manages sidebar navigation for features like Building Blocks, Term Search, and JSON Import, while also enforcing a light theme when running in the ARCitect host. The UI layer now utilizes Tailwind CSS with DaisyUI themes (finster, sunrise, planti, viola) for styling, replacing previous styling approaches, and integrates local storage persistence for autosave and search configurations.
src/Client · high confidence
Error modal now supports queuing, batching, and scoped dismissal
The ErrorModal component has been refactored to handle multiple errors more effectively. It now supports queuing errors so users can dismiss them sequentially, batching multiple errors into a single modal view, and scoping dismissals so that dismissing related errors does not affect unrelated ones. The modal also displays a list of pending errors when additional errors are queued.
src/Components/src/Primitive/ErrorModal · high confidence
Improved ARC file integrity and DataMap handling
The application now uses specialized loading and writing logic to protect ARC file integrity and improve DataMap support. Loading skips Git metadata directories and automatically migrates outdated DataMap file paths to their canonical locations. Writing operations are restricted to managed ARC payload contracts, preventing accidental overwrites of unmanaged files like notes, and includes a repair step to regenerate zero-byte workbooks left by interrupted saves. Additionally, DataMap deletion now correctly updates the parent entity, and in-memory change detection has been refined to accurately track DataMap modifications.
src/Electron/src/Main/ARCtrlExtensions · high confidence
Improved clipboard reliability and table import behavior in ARCtrl
The ARCtrl component now handles clipboard operations more robustly by introducing a centralized codec that preserves structured metadata (such as terms and units) via a JSON payload while maintaining a plain-text fallback for broader browser compatibility. This change fixes issues where copy-paste operations outside the application or in browsers without advanced clipboard support would previously break or lose data. Additionally, table joining logic has been refined to prevent duplicate columns when importing or merging tables, and a new normalization step ensures that empty sparse columns in JSON exports are correctly restored during import, preventing data loss for empty cells.
src/Components/src/ARCtrl · high confidence
Introduce Neo4j-based database layer with tree search capabilities
The backend database implementation has been replaced with a new Neo4j graph database integration. This change introduces a new \Database.Helper\ module for connection management and query execution, alongside specific modules for \Ontology\, \Term\, and \TreeSearch\. Users gain access to enhanced search functionality, including full-text search with performance optimizations (such as distance verification and specific query structures for parent/child relationships) and a new tree search feature that retrieves term hierarchies using Neo4j's path algorithms.
src/Server/Database · high confidence
Introduce new virtualized table component with keyboard navigation
The table component in the Composite layer has been replaced with a new implementation that uses TanStack Virtual for row and column virtualization, significantly improving performance for large datasets. This new component introduces native keyboard navigation, allowing users to select cells and ranges using arrow keys, and supports standard clipboard shortcuts (Ctrl+C, Ctrl+V, Ctrl+X) for copying and pasting cell data. It also includes a unified context menu for operations like filling columns and clearing data, and fixes a scrolling bug where the table would not correctly scroll to the last column or row.
src/Components/src/Composite/Table · high confidence
Introduction of hash-based SPA routing and separated view components
The application now uses hash-based single-page application (SPA) routing to manage navigation between distinct views. This change introduces new view modules in the client layer: \MainPageViews.fs\ handles the main application shell with a drawer-based navigation for Settings, About, and Privacy Policy pages; \SidebarView.fs\ manages the sidebar content, dynamically rendering components like Building Block, Term Search, and File Picker based on the current sidebar route; \SpreadsheetView.fs\ serves as the primary data entry interface, supporting Table, Metadata, and DataMap views; and \NotFoundView.fs\ provides a fallback for invalid URLs. This structural shift separates the UI concerns into dedicated view files, replacing the previous monolithic or less-structured view logic.
src/Client/Views · high confidence
New Git sidebar UI with dependency checks and cancelable operations
The Git sidebar now features a dedicated empty-state view that prompts users to open or download an ARC, and includes a startup check for required version-control dependencies (Git and LFS) that displays an error modal if they are missing or incompatible. Remote operations such as fetch, pull, push, and clone are now cancellable, and the interface warns users that these actions require a signed-in DataHUB account.
src/Electron/src/Renderer/Components/LeftSidebar/Git · high confidence
New build system and updated Excel add-in manifest
The build process has been restructured with a new F\#-based build script (Build.fs) that centralizes commands for bundling, testing, and releasing (NuGet, NPM, Docker, Electron). The Excel add-in manifest has been updated to reflect the new 'Swate' branding, replacing the previous 'CSBAnnotator' identity, and now points to the production URL (swate-alpha.nfdi4plants.org) in the production manifest while keeping localhost for development. A new Dockerfile.publish is introduced for containerized builds.
build · high confidence
New build, release, and test automation modules
This change introduces new F\# modules in the build system to manage the project's build, release, and testing workflows. The Bundle module now handles client bundling via Fable and Vite, and server publishing. The Release module orchestrates publishing to npm (including CSS layer adjustments), NuGet, Docker (with prerelease tagging logic), and Electron binary generation. The Run module supports parallel execution of the server, client, database, and Excel add-in during development. Finally, the Test module consolidates test execution, migrating Electron core and renderer tests to Vitest while retaining Mocha for client tests, and adding utilities for cleaning generated outputs and managing Office add-in development certificates.
build/Actions · high confidence
New extension modules for ARCtrl core types
This change introduces a set of new extension modules in the ARCtrl component to enhance data handling and user interaction. It adds \TryArcFileByPath\ to the \ARC\ type for resolving file paths to specific investigation entities (Assay, Study, Workflow, Run, DataMap). Table interactions are improved with \AddRowsEmptyKeepingUnits\ to preserve column units when adding rows, and \ClearCell\ for precise cell clearing. Clipboard and data serialization are refined via \CompositeCell\ extensions, including \GetContentSwate\, \ToClipboardStr\ (which preserves data selectors), and \fromContentValid\ for robust parsing. Additionally, \DataMap\ gains explicit \GetCell\ and \SetCell\ methods for direct data binding, and \Template\ provides a standardized Excel filename generation.
src/Components/src/ARCtrl/Extensions · high confidence
New metadata editing forms for Assay, Investigation, Run, Study, Template, and Workflow
The metadata editing interface has been rebuilt with new, dedicated form components for Assay, Investigation, Run, Study, Template, and Workflow entities. These forms provide structured input fields for identifiers, titles, descriptions, ontology annotations, personnel, and dates, utilizing a shared UI library (Feliz/ARCtrl) for consistent styling and validation. Key improvements include SemVer validation for workflow versions, integration with external APIs (ORCID, PubMed, Crossref) for author and publication lookups, and specific handling for ARCitect-hosted metadata restrictions.
src/Client/SharedComponents/Metadata · high confidence
Provenance Grouping connectors now render as sankey ribbons with animated morphing
The Provenance Grouping page now uses sankey-style ribbons instead of simple lines to visualize connections between groups and members. Ribbons are translucent and scale their width based on the number of underlying connections, making dense data flows easier to read. Connector paths morph smoothly during layout changes, and the new overlay system measures and renders these paths efficiently using layout observers.
src/Components/src/Page/ProvenanceGrouping · high confidence
Refactor Select component into generic, single, and multi-select variants
The Select primitive has been restructured to separate concerns: a shared \GenericSelect\ implementation now handles core dropdown logic, while \SingleSelect\ and \MultiSelect\ provide specialized behaviors for single and multiple item selection respectively. This change introduces a \SelectContext\ for state management and adds a 'Select all' option to the multi-select variant, allowing users to choose between single and multi-selection modes more explicitly.
src/Components/src/Primitive/Select · high confidence
Refactored ARC file operations into a new main-process IPC layer
The Electron main process now handles ARC file operations (delete, rename, and file system I/O) through a new set of IPC modules, replacing previous implementations. This change introduces stricter path validation to prevent traversal attacks, adds retry logic for transient file system errors (such as EPERM or EBUSY on Windows), and enforces entity-specific rules for deleting and renaming ARC assets like assays, studies, and workflows. It also centralizes authentication, version control, and template fetching logic into dedicated IPC APIs to improve security and separation of concerns.
src/Electron/src/Main/IPC · high confidence
Renderer UI and state management overhaul
The Electron renderer has been refactored to use a new Elmish-based architecture for state management, introducing a \MainSyncedState\ hook to safely handle asynchronous snapshots and live updates from the main process. The UI now features a new left sidebar with navigation for File Explorer and Git, alongside buttons to open the DataHUB browser and Validation Package browser. A new \PageState\ type system manages view transitions, supporting pages for ARC files, markdown, notes, and version control operations like diffs and conflict resolution. Additionally, the renderer now uses a provider-neutral IPC layer for version control operations and applies a new Tailwind CSS theme configuration with multiple color themes (Amaze, Finster, Sunrise, Planti, Viola).
src/Electron/src/Renderer · high confidence
Replaced legacy modal components with new Feliz-based UI
The modal system in the client has been rewritten to use Feliz and Tailwind CSS classes (prefixed with 'swt:') instead of the previous DaisyUI/Bulma components. This change introduces new implementations for key modals, including a term details view that fetches ontology data, a selective import modal with column-level selection controls, an interop logging viewer, and a table reset confirmation. Supporting infrastructure includes a new ModalElements module for shared UI primitives (buttons, radios, boxes) and a ModalProvider that routes modal states, effectively migrating the user interface from the old styling framework to the new one.
src/Client/Modals · high confidence
Server API restructured with versioned endpoints and Neo4j configuration
The server backend has been refactored to expose a new, versioned API structure. The previous generic counter API has been replaced by specific endpoints for ontology data (IOntologyAPI v1, v2, and v3), template management (ITemplateAPI v1), and service information (IServiceAPI v1). These endpoints now retrieve Neo4j database credentials from the application configuration (populated via dev.json or environment variables) rather than hardcoded values. Additionally, a new Version module defines the assembly version as 2.0.0, and a static test page for Cytoscape visualization has been added to the public directory.
src/Server · high confidence
Sidebar restructured with new layout components and metadata management
The sidebar interface has been reorganized to use new layout helper components (LayoutHelper, Footer, Navbar, Tabs) that define the visual structure and navigation. A key functional addition is the ability to create, update, and delete top-level metadata types (Investigation, Study, Assay, Template) directly from the sidebar's Navbar, including a modal for selecting and editing metadata. The footer now displays the client and server version information with a link to release notes.
src/Client/SidebarComponents · high confidence
Term Search now supports configurable TIB catalog queries and migration of local storage keys
The Term Search component now includes a configuration provider and setter that allow users to enable and select specific TIB (Thesaurus for Integrated Biology) term search collections, such as DataPLANT and NFDI4CHEM, via a multi-select interface. This change introduces a new local storage key, 'swate-termsearchconfig-ctx', to persist the user's selected active search keys and default search preferences. To ensure a smooth transition, the component automatically detects and migrates obsolete local storage values from the previous key format ('aktiveKeys') to the new structure ('activeKeys'), removing the old entry to prevent confusion. Additionally, the component behavior has been adjusted so that the combo box is no longer automatically entered or focused when triggered from an annotation table cell, improving the user experience in those specific contexts.
src/Components/src/Composite/TermSearch · high confidence
Version control system refactored to support multiple providers and DataHUB authentication
The version control subsystem has been restructured to replace the previous built-in Git implementation with a provider-neutral session host. This change introduces support for multiple version control backends, specifically Git and lakeFS, managed through a new composition root. For DataHUB users, authentication is now handled via a dedicated strategy module that resolves credentials and revision identities from the account store, ensuring that commits and operations are correctly attributed. The update also includes new mapping layers for IPC communication, a robust binding store for persisting workspace-to-provider associations, and improved handling of repository settings and large-object storage policies.
src/Electron/src/Main/VersionControl · high confidence
Test coverage
Add client-side test suite with Office add-in mocking; Added comprehensive test coverage for ARC file operations and file tree logic; Added initial server-side unit tests; Added renderer tests for file tree, Git workflows, and import logic; Added shared test suite for provenance, path handling, and landing page logic; Added test coverage for ArcMerge event handling and path parsing; Added test fixtures for composite table components; Added tests for Data Annotator path resolution and table integration; Added tests for DataHUB ExplorePanel Elmish logic; Added tests for LFS file busy state behavior; Added unit tests for Office Add-in annotation table operations; Added unit tests for table context menu and keyboard navigation.
Dependencies
Migrate to .NET 10 and centralize dependency management
The project has upgraded its .NET target framework to net10.0 across the build, Electron, and test projects, replacing the previous netcoreapp3.1/netstandard2.0 targets. To support this and improve maintainability, the legacy Paket dependency manager has been removed in favor of MSBuild's central package management (Directory.Packages.props). This change introduces a unified versioning strategy for key libraries, including ARCtrl 3.0.0-beta.12, Feliz 3.1.1, and Fable.Core 5.0.0-beta.4, while also updating the Electron runtime to version 40.10.2.
(dependencies) · high confidence
Housekeeping
Added documentation for icon generation process
A new README file has been added to the icons directory, documenting that the base icon design was created in PowerPoint and subsequently generated for all platforms using the electron-icon-maker tool.
src/Electron/assets · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 49 → 50 (+1.3)
- Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.
Lenses
- Code Health 74 → 75 (+0.3)
- Architecture 94 → 84 (-9.3)
- Maturity 73 → 72 (-0.4)
- Readiness 38 → 40 (+2.5)
- Security 70 → 70 (+0.0)
- Accessibility 40 → 44 (+4.1)
Resolved (71)
- Change coupling: IGitApi.fs ↔ GitApiClient.fs (src/Electron/src/Main/IPC/IGitApi.fs)
- Change-coupling hub: GitService.fs → GitStateContext.fs, GitWorkflow.fs, GitApiClient.fs (src/Electron/src/Main/Git/GitService.fs)
- Duplicated block (10 lines × 2) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- Duplicated block (11 lines × 2) (src/Electron/src/Main/Git/GitService.fs)
- Duplicated block (11 lines × 2) (src/Electron/src/Main/Git/GitlfsAdapter.fs)
- Duplicated block (12 lines × 2) (src/Electron/src/Main/Git/GitService.fs)
- Duplicated block (13 lines × 2) (src/Electron/src/Main/Git/GitService.fs)
- Duplicated block (13 lines × 2) (src/Electron/src/Main/Git/GitService.fs)
- Duplicated block (14 lines × 2) (src/Electron/src/Main/Git/GitService.fs)
- Duplicated block (14 lines × 2) (src/Electron/src/Main/Git/GitService.fs)
- Duplicated block (14–15 lines × 2) (src/Electron/src/Main/Git/GitService.fs)
- Duplicated block (18 lines × 2) (src/Electron/src/Main/Git/GitLfsService.fs)
- Duplicated block (27 lines × 2) (src/Client/SharedComponents/JsBindings/DndKit.fs)
- Duplicated block (5 lines × 3) (src/Electron/src/Renderer/Context/GitWorkflow.fs)
- Duplicated block (5 lines × 3) (src/Electron/src/Renderer/Context/GitWorkflow.fs)
- Duplicated block (5–6 lines × 2) (src/Electron/src/Renderer/Context/GitWorkflow.fs)
- Duplicated block (7 lines × 2) (src/Electron/src/Main/Git/GitService.fs)
- Duplicated block (8 lines × 2) (src/Electron/src/Main/Git/GitService.fs)
- FileTooLong: Git/GitLfsService.fs (src/Electron/src/Main/Git/GitLfsService.fs)
- FileTooLong: Git/GitService.fs (src/Electron/src/Main/Git/GitService.fs)
- …and 51 more
New (51)
- ArcVaultExtensions.ArcVault.ApplyWatcherFileTreeEvents (cognitive 17) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- ArcVaultExtensions.ArcVault.RenameOpenArcRoot (cyclomatic 19) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- ArcVaultExtensions.ArcVault.TryApplyWatcherArcMergeIfEligible (cognitive 34) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- ArcVaultExtensions.ArcVault.TryApplyWatcherArcMergeIfEligible (cyclomatic 19) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- ArcVaultExtensions.ArcVault._FileEventController (cognitive 74) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- ArcVaultExtensions.ArcVault._FileEventController (cyclomatic 31) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- ArcVaults.DisposeVault (cognitive 17) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- ArcVaults.OnCloseWindow (cyclomatic 23) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- Documentation: contradicts the code (docs/GitFunctionalityUserGuide.md)
- Documentation: contradicts the code (docs/Structure.md)
- Duplicated block (12 lines × 2) (src/Electron/src/Main/ArcVault/ArcVault.fs)
- Duplicated block (14–19 lines × 2) (src/Electron/src/Renderer/Context/GitWorkflow.fs)
- Duplicated block (6 lines × 2) (src/Electron/src/Main/IPC/IVersionControlApi.fs)
- Duplicated block (6 lines × 2) (src/Electron/src/Renderer/Context/GitWorkflow.fs)
- Duplicated block (7 lines × 2) (src/Electron/src/Main/IPC/IVersionControlApi.fs)
- FileTooLong: FileExplorer/FileTree.fs (src/Electron/src/Renderer/Components/LeftSidebar/FileExplorer/FileTree.fs)
- FileTooLong: IPC/IVersionControlApi.fs (src/Electron/src/Main/IPC/IVersionControlApi.fs)
- GitDiffPageLoader.load (cognitive 18) (src/Electron/src/Renderer/Context/GitWorkflow.fs)
- GitDiffPageLoader.load (cyclomatic 17) (src/Electron/src/Renderer/Context/GitWorkflow.fs)
- GitSidebar.ChangedFilesList (cognitive 19) (src/Components/src/Page/GitSidebar/GitSidebar.fs)
- …and 31 more
Changes since last survey
- 209 commits — 189 feature/other, 20 fixes
By area
- src/Electron — 124 commits
- tests/Electron.Core — 20 commits
- (repo) — 17 commits
- (root) — 17 commits
- src/Components — 17 commits
- docs/GitFunctionalityUserGuide.md — 4 commits
- src/Client — 4 commits
- tests/Electron.Renderer — 4 commits
- .github/workflows — 2 commits
Notable commits
- fix: * showed new windows before loading large ARCs * validated ARC roots in the lifecycle controller * reported ARC-open errors with awaited native dialogs * cleaned up failed window registrations * surfaced initial renderer startup failures * added lifecycle and error-dialog regression tests
- fix: Added and updated ARC lifecycle regression tests to be harder
- fix: Drop the story checks that only pin fixed tooltip, label and help texts
- fix: Drop the unused update_rejected literal and fix the replay list in the guide
- fix: Fixed ARC window lifecycle regressions
- fix: Fixed changelog that was messed up during merge
- fix: Fixed remaining ARC lifecycle race.
- fix: Implemented empty-window CreateARC rollback fix.
- fix: Implemented lifecycle regression test.
- fix: Implemented the close-during-ARC-load lifecycle fix.
- fix: Implemented the destroyed-window boundary fix.
- fix: Implemented the scoped cancellation and IPC-boundary fixes.
- fix: Merge branch 'main' into bug/failing-image-datahubbrowser-#1180
- fix: Merge pull request #1339 from nfdi4plants/Bug/FixWrongFolderSelection
- fix: Merge pull request #1370 from nfdi4plants/bug/failing-image-datahubbrowser-#1180
- fix: Merge pull request #1375 from nfdi4plants/bug/fix-test-cases-for-git-sidebar
- fix: Merge pull request #1377 from nfdi4plants/Bug/FixAddIsaSorting
- fix: Revert vitest to original implementation
- fix: fix
- fix: fix
- …and 189 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
nfdi4plants/Swate was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 6ce476f99afa7a83814435fa8562cdad0ded8826 — the exact code this score is about.
- Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-4f4226d619ea.