Formicaio

Responsible records only show when a quote is requested from a node that has records they are responsible for. So if your nodes are not giving quotes then you will not see any responsible records figures. Even if they have them

So I’d look at the quoting issue. Make sure your nodes are contactable by clients.

They will get them a lot faster than that. Just that quotes are not requested as quick and why it takes hours on your VPSs

In a few days I can kick off my quote request script and if you give me the peerIDs of your home nodes then I can request quotes from them and see if they are found

3 Likes

Subject: [SCRIPT] Formicaio Log Cleanup Tool - Reclaim Disk Space Easily!

Me, but mostly AI made script to free up disk space by deleting old logs, from 32gb to 5gb on my setup. the scrip file can be downloaded with anttp: 1056ab9f3bfd8a9e896463669e3eac79ef447ae7d4e4f498971f023f27b7d286
or last in this post

I will shut up and let the AI speek…

Are your Formicaio installations (specifically node_data folders) eating up valuable disk space with old log files? I’ve developed a PowerShell script to help you easily manage and clean up these logs.

This script is designed to:

  • Automatically Find Logs: It intelligently searches for your node_data folders and their logs subdirectories, so you don’t have to manually locate them.
  • Estimate Space Savings: Before deleting anything, it calculates and shows you exactly how much disk space you can reclaim by keeping logs for different hourly periods.
  • Flexible Retention: You choose precisely how many hours of logs you want to keep.
  • Safe Deletion: It is programmed to avoid deleting the currently active log file.
  • Easy to Use: Interactive prompts guide you through the process, or you can run it via parameters for automation.

Prerequisites (Important!):

  1. Operating System: Windows (this is a PowerShell script).
  2. PowerShell Version: PowerShell 5.1 or newer.
  3. Administrator Privileges: You will need to run PowerShell as an Administrator for these two reasons:
  • To set the PowerShell Execution Policy (a one-time setup).
  • To ensure the script has the necessary permissions to find and delete files in potentially protected system directories.
  1. PowerShell Execution Policy: To allow the script to run, your PowerShell Execution Policy needs to be configured.
  • Open PowerShell as Administrator (right-click the PowerShell icon and select “Run as administrator”).

  • Run the following command: PowerShellSet-ExecutionPolicy RemoteSigned -Scope CurrentUser

  • Type Y and press Enter when prompted to confirm. (This setting allows local scripts to run while still providing security for downloaded scripts).


How to Use:

  1. Save the Script: Copy the entire code block provided below and save it as a .ps1 file (e.g., CleanupFormicaioLogs.ps1) on your desktop or in a dedicated scripts folder.
  2. Run the Script:
  • Interactive Mode (Recommended for first use):

    • Open PowerShell as Administrator.
    • Navigate to the folder where you saved the script (e.g., cd C:\Users\YourUser\Desktop).
    • Run the script by typing: PowerShell.\CleanupFormicaioLogs.ps1
  • The script will then guide you through selecting a drive/path to search and choosing your desired log retention (in hours) based on the estimated savings.

  • Automated Mode (e.g., via Task Scheduler): You can pass parameters directly to bypass interactive prompts. For example, to search your C:\ drive and keep logs for the last 72 hours (3 days):PowerShell.\CleanupFormicaioLogs.ps1 -RootSearchPath "C:\" -HoursToKeep 72

  • (For Task Scheduler, the ‘Program/script’ field would be powershell.exe, and ‘Add arguments’ would be something like -ExecutionPolicy Bypass -File "C:\Path\To\Your\Script\CleanupFormicaioLogs.ps1" -RootSearchPath "C:\" -HoursToKeep 72)


Important Notes & Disclaimer:

  • Always Test First! Before running the script with actual deletion in mind, I highly recommend running a test with a very high HoursToKeep value (e.g., 9999) first. This will show you the estimated savings and which files would be deleted without actually removing anything.
  • Backup: While this script is designed with safety in mind, it performs file deletions. If you have any critical log files or are unsure, always consider backing up your data before running any cleanup script.
  • This script specifically targets antnode.log* files within logs subfolders under node_data. If your Formicaio logs have different primary names or subfolder structures, you can adjust the -LogFileNamePattern and -LogSubfolderName parameters when running the script.

The Script Code:

<#
.SYNOPSIS
    Cleans up old 'antnode' log files from 'node_data' directories.

.DESCRIPTION
    This script automatically finds 'node_data' folders, typically created by 'antnode' applications.
    It then scans 'logs' subfolders within each node, calculates potential disk space savings
    for various retention periods (in hours), and finally deletes log files older than a user-specified number of hours.

.PARAMETER RootSearchPath
    The top-level directory where the script should start searching for 'node_data' folders.
    If provided, the script will attempt to use this path directly. If the path is invalid
    or 'node_data' folders are not found there, it will fall back to an interactive menu.

.PARAMETER HoursToKeep
    The number of hours to keep log files. Log files older than this will be deleted.
    If not provided, the script will calculate and present estimated space savings
    for various retention periods before prompting the user for this value.

.PARAMETER LogFileNamePattern
    The filename pattern for log files to target (e.g., "antnode.log*").
    Defaults to "antnode.log*".

.PARAMETER LogSubfolderName
    The name of the subfolder within each node where logs are stored (e.g., "logs").
    Defaults to "logs".

.EXAMPLE
    # Interactive execution: Script will guide through drive selection and hours to keep
    .\cleanup_antnode_logs.ps1

.EXAMPLE
    # Automated execution: Search C:\ and keep logs for 24 hours
    .\cleanup_antnode_logs.ps1 -RootSearchPath "C:\" -HoursToKeep 24

.EXAMPLE
    # Automated execution with a specific, custom path and 7 days (168 hours) retention
    .\cleanup_antnode_logs.ps1 -RootSearchPath "D:\MyApps\Formicaio" -HoursToKeep 168

.NOTES
    Requires PowerShell 5.1 or newer.
    Run with Administrator privileges if log files are in protected system directories.
    It is recommended to run a test with -HoursToKeep 9999 (or any large number) to see the estimated savings
    before running with actual deletion hours.
#>
param(
    [string]$RootSearchPath = "", # Default to empty to trigger interactive menu
    [int]$HoursToKeep = 0,        # Default to 0 to trigger prompt
    [string]$LogFileNamePattern = "antnode.log*",
    [string]$LogSubfolderName = "logs"
)

# Helper function to format bytes into a readable size (KB, MB, GB)
function Format-Bytes {
    param([long]$Bytes)
    if ($Bytes -ge 1GB) {
        "{0:N2} GB" -f ($Bytes / 1GB)
    } elseif ($Bytes -ge 1MB) {
        "{0:N2} MB" -f ($Bytes / 1MB)
    } elseif ($Bytes -ge 1KB) {
        "{0:N2} KB" -f ($Bytes / 1KB)
    } else {
        "$Bytes Bytes"
    }
}

# --- Start: Robust Drive/Path Selection and node_data Search with Retry ---

$nodeDataFolders = $null # Will hold the array of found node_data paths
$finalSearchRoot = $null # The path that was successfully used to find node_data folders

# Flag to control the main loop for finding node_data folders
$searchSuccessful = $false

# Attempt to use RootSearchPath parameter if provided
if (-not [string]::IsNullOrWhiteSpace($RootSearchPath)) {
    Write-Host "Attempting to use specified RootSearchPath parameter: '$RootSearchPath'..."
    if (Test-Path $RootSearchPath -PathType Container) {
        $nodeDataFolders = Get-ChildItem -Path $RootSearchPath -Directory -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq 'node_data' }
        if ($nodeDataFolders) {
            $searchSuccessful = $true
            $finalSearchRoot = $RootSearchPath
        } else {
            Write-Warning "No 'node_data' folders found under '$RootSearchPath' (from parameter). Falling back to interactive selection."
        }
    } else {
        Write-Warning "Specified RootSearchPath parameter '$RootSearchPath' does not exist or is not a directory. Falling back to interactive selection."
    }
}

# Enter interactive selection loop if not successful with parameter
do {
    if ($searchSuccessful) { break } # Exit loop if already found via parameter or previous interactive attempt

    Write-Host "`n--- Select a search option for 'node_data' folders ---"
    
    # 1. List available local drives
    $drives = Get-PSDrive -PSProvider FileSystem | Where-Object { $_.Name -match '^[A-Z]$' } | Sort-Object Name
    $optionCounter = 1
    if ($drives) {
        Write-Host "Choose from available drives:"
        foreach ($drive in $drives) {
            Write-Host "$($optionCounter). $($drive.Name):\"
            $optionCounter++
        }
    } else {
        Write-Warning "No local drives detected. Please use the 'Enter custom path' option."
    }

    # 2. Option to enter a custom path manually
    Write-Host "$($optionCounter). Enter a custom path manually (e.g., C:\YourAppFolder\)"
    $optionCounter++

    # 3. Option to exit the script
    Write-Host "$($optionCounter). Exit script" 

    $userChoice = Read-Host "Enter the number corresponding to your choice"

    $chosenOptionIndex = $null
    $selectedSearchRoot = $null

    if ([int]::TryParse($userChoice, [ref]$chosenOptionIndex)) {
        if ($chosenOptionIndex -ge 1 -and $chosenOptionIndex -le $drives.Count) {
            $selectedSearchRoot = "$($drives[$chosenOptionIndex - 1].Name):\" 
        } elseif ($chosenOptionIndex -eq ($drives.Count + 1)) { # Custom path option
            $selectedSearchRoot = Read-Host "Please enter the full custom root directory (e.g., C:\MyFolder\)"
            if ([string]::IsNullOrWhiteSpace($selectedSearchRoot)) {
                Write-Warning "No custom path entered. Please try again."
                continue # Restart the loop
            }
        } elseif ($chosenOptionIndex -eq ($drives.Count + 2)) { # Exit option
            Write-Host "Exiting script as requested."
            exit 0
        } else {
            Write-Warning "Invalid choice. Please enter a number from the provided list."
            Start-Sleep -Seconds 1
            continue # Restart the loop
        }
    } else { # Input was not a number
        Write-Warning "Invalid input. Please enter a number."
        Start-Sleep -Seconds 1
        continue # Restart the loop
    }

    # Validate the selected/entered search root
    if (-not (Test-Path $selectedSearchRoot -PathType Container)) {
        Write-Warning "The specified path '$selectedSearchRoot' does not exist or is not a directory. Please verify."
        Start-Sleep -Seconds 1
        continue # Restart the loop
    }

    Write-Host "Searching for 'node_data' folders under '$selectedSearchRoot'..."
    $nodeDataFolders = Get-ChildItem -Path $selectedSearchRoot -Directory -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq 'node_data' }

    if ($nodeDataFolders) {
        $searchSuccessful = $true
        $finalSearchRoot = $selectedSearchRoot
    } else {
        Write-Warning "No 'node_data' folders found under '$selectedSearchRoot'. Please try a different drive/path."
        Start-Sleep -Seconds 1
    }

} while (-not $searchSuccessful) # Loop until node_data folders are successfully found

# Display found folders
Write-Host "Found the following 'node_data' folder(s):"
$nodeDataFolders | Select-Object FullName
Write-Host "" # Blank line for spacing

# --- End: Robust Drive/Path Selection and node_data Search with Retry ---


# --- Calculate and present potential free space (if HoursToKeep not provided as parameter) ---
if ($HoursToKeep -eq 0) {
    Write-Host "`nCalculating potential disk space to be freed for different retention periods. This might take a moment..."

    # Define sample hours to calculate potential freed space for
    $sampleHoursOptions = @(1, 2, 5, 12, 24, 72, 168, 336, 720) # Added 2, 5, 12 hours here

    # Hash table to store the total size (in bytes) that would be freed for each option
    $freedSpaceEstimates = @{}
    foreach ($hour in $sampleHoursOptions) {
        $freedSpaceEstimates[$hour] = 0
    }
    $freedSpaceEstimates["0_hours_total"] = 0 # For total old logs if 0 hours retention

    # Iterate through all found 'node_data' folders and their logs to gather sizes
    foreach ($nodeDataFolder in $nodeDataFolders) {
        $currentRootLogPath = $nodeDataFolder.FullName
        
        $nodeFolders = Get-ChildItem -Path $currentRootLogPath -Directory

        foreach ($nodeFolder in $nodeFolders) {
            $logFilesPath = Join-Path -Path $nodeFolder.FullName -ChildPath $LogSubfolderName 
            
            if (Test-Path $logFilesPath -PathType Container) {
                # Get all log files that are candidates for deletion (i.e., not the active 'antnode.log' without a timestamp)
                $candidateLogFiles = Get-ChildItem -Path $logFilesPath -File -Filter $LogFileNamePattern | Where-Object { $_.Name -notlike "antnode.log" }

                foreach ($file in $candidateLogFiles) {
                    $freedSpaceEstimates["0_hours_total"] += $file.Length

                    foreach ($hour in $sampleHoursOptions) {
                        # Change from AddDays to AddHours
                        $cutoffDate = (Get-Date).AddHours(-$hour)
                        if ($file.LastWriteTime -lt $cutoffDate) {
                            $freedSpaceEstimates[$hour] += $file.Length
                        }
                    }
                }
            }
        }
    }

    Write-Host "`n--- Estimated Disk Space Savings ---"
    Write-Host "If you keep logs for:"

    foreach ($hour in $sampleHoursOptions | Sort-Object) { # Sort to display in ascending order
        $displaySize = Format-Bytes -Bytes $freedSpaceEstimates[$hour]
        Write-Host "$($hour) hour(s): $($displaySize) will be freed up."
    }

    $totalDisplaySize = Format-Bytes -Bytes $freedSpaceEstimates["0_hours_total"]
    Write-Host "0 hour(s) (delete all old logs): $($totalDisplaySize) will be freed up."
    Write-Host "------------------------------------`n"

    # Prompt the user for the number of hours to keep logs based on the estimates
    $hoursToKeepInput = Read-Host "Enter how many hours old log files should be kept based on the estimates above"

    # Initialize $hoursToKeepRef to ensure it exists for [ref]
    $hoursToKeepRef = $null 
    # Try to convert the input to an integer
    if ([int]::TryParse($hoursToKeepInput, [ref]$hoursToKeepRef)) {
        $HoursToKeep = $hoursToKeepRef # Set the parameter value
        Write-Host "Keeping logs for the last $HoursToKeep hours."
    } else {
        # If the input is not a valid number, use a default value and notify the user.
        $HoursToKeep = 168 # Default to 168 hours (7 days) if input is invalid
        Write-Warning "Invalid input. Using default value of $HoursToKeep hours (7 days)."
    }
} else {
    Write-Host "Hours to keep specified as parameter: $HoursToKeep hours."
}

# --- Perform Log Cleanup ---
Write-Host "Starting log cleanup..."

# Iterate through each found 'node_data' folder
foreach ($nodeDataFolder in $nodeDataFolders) {
    $currentRootLogPath = $nodeDataFolder.FullName 
    Write-Host "`n--- Processing logs in: $currentRootLogPath ---" 

    # Get all subfolders (the actual 'node' folders) inside this node_data folder
    $nodeFolders = Get-ChildItem -Path $currentRootLogPath -Directory

    foreach ($nodeFolder in $nodeFolders) {
        $currentNodePath = $nodeFolder.FullName
        
        $logFilesPath = Join-Path -Path $currentNodePath -ChildPath $LogSubfolderName
        
        if (Test-Path $logFilesPath -PathType Container) {
            # Find all log files that are candidates for deletion
            $logFiles = Get-ChildItem -Path $logFilesPath -File -Filter $LogFileNamePattern | Where-Object { $_.Name -notlike "antnode.log" }

            foreach ($file in $logFiles) {
                # Change from AddDays to AddHours
                $cutoffDate = (Get-Date).AddHours(-$HoursToKeep) 
                
                if ($file.LastWriteTime -lt $cutoffDate) {
                    Write-Host "    DELETING: $($file.FullName) (Modified: $($file.LastWriteTime))"
                    Remove-Item -LiteralPath $file.FullName -Force
                }
            }
        }
    }
}

Write-Host "`nLog cleanup completed for all found 'node_data' folders."
3 Likes

Woho, finally a first class node runner :slight_smile:

7 Likes

Amazing software! it autoupgraded to 0.4.1 :slight_smile:

8 Likes

Formicaio v0.5.5

Formicaio version 0.5.5 has been released and it’s ready for installation across all supported platforms in native mode.

Docker containers built with this new version, including for UmbrelOS and CasaOS, will be were also published in the next few hours.

This new minor release allows the user to specify the IP the node/s should listen on. The IP can be either set from the GUI or using a new --ip-addr argument now supported by the CLI nodes create command. I would recommend upgrading to this new version only if you are interested in such a feature, otherwise there is no good reason to upgrade right now.

If this is your first time installing Formicaio, you can easily follow the installation instructions in the README.

Make sure that, after upgrading, you refresh the page of any instance of the Formicaio frontend/GUI you have open on a browser with Ctrl + F5.

7 Likes

I moved from launchpad to formicaio a few weeks ago.

It is great!

Thank you.

4 Likes

Formicaio v0.5.6

Formicaio version 0.5.6 has been released and it’s ready for installation across all supported platforms and installation methods.

This new minor release introduces a few improvements, fixes and new feature:

  • GUI enhancements: Separated basic and advanced options for adding nodes
  • Minor GUI fix: Resolved an issue where adding new node(s) would fail, it now removes the placeholder node and displays a popup alert message
  • Custom Data Directory: Users can now (optionally) specify a custom data directory path for each new node or batch of new nodes
  • Error Response Improvement: Enhanced the GUI error response for 404 page
  • Codebase Refactor: Conducted a refactor of the codebase and added unit tests for a few data types and private APIs

I would recommend upgrading to this new version only if you are interested in any of the mentioned improvements/features, otherwise there is no good reason to upgrade right now.

If this is your first time installing Formicaio, you can easily follow the installation instructions in the README.

Make sure that, after upgrading, you refresh the page of any instance of the Formicaio frontend/GUI you have open on a browser with Ctrl + F5.

9 Likes

One improvement that I’d suggest is the ability to give update nodes a new PeerID. This can be easily achieved by deleting the secrets file in the node directory once the node is stopped and before starting it again. This is actually beneficial in terms of ensure the network does not stagnate in terms of records never moving around and potential of one person being able to corner a part of the network. Ask me how I know and I won’t answer :wink: . But for now it helps in a small way with the current network issue. But of course the nodes should be restarted one at a time so excessive churning is not caused for large setups.

Another could be the option to delete the bootstrap cache (advanced option) before each node starting again which helps with the current network situation.

1 Like

This is already possible in Formicaio by ‘recycling’ the node/s, which can be triggered on individual nodes or user selected ones.

2 Likes

Ah ok.

If I were to select all nodes, does it do it one by one, or does it stop all at once and restart?

Formicaio v0.6.0

Formicaio version 0.6.0 has been released and it’s ready for installation across all supported platforms in native mode.

Docker containers built with this new version, including for UmbrelOS and CasaOS, will be also published in the next few hours.

This new release introduces a few improvements and features:

  • Removed home-network/relayed mode for nodes.

  • Node auto-upgrades are now executed as a batch of node actions, giving users clear visibility into when auto-upgrade is in progress and the option to cancel it if desired.

  • Internal codebase refactoring to improve organization and reduce technical debt.

  • Enhanced documentation for public data types and updated parts of the README instructions.

Users currently running nodes in home-network mode don’t need to upgrade to this version immediately. However, please note that the upcoming antnode release will no longer support this mode once updated.

If this is your first time installing Formicaio, you can easily follow the installation instructions in the README.

Make sure that, after upgrading, you refresh the page of any instance of the Formicaio frontend/GUI you have open on a browser with Ctrl + F5.

11 Likes

Thanks for taking care off removal off these flags in the newer version.

To ease the transition for a release or two, even if the flags somehow manage to exist in the service’s definition (even after a upgrade transition), the base binary, antnode, will simply ignore those –relay flags.

As a heads up, there will be metrics to dictate what your reachability status on a per antnode basis via its metric server port if enabled:

ant_networking_reachability_status{status=“Ongoing”} 1
ant_networking_reachability_status{status=“NotPerformed”} 0
ant_networking_reachability_status{status=“NotRoutable”} 0
ant_networking_reachability_status{status=“Reachable”} 0
ant_networking_reachability_status{status=“UPnPSupported”} 0

These enums are not fully decided yet (work-in-progress), and may change prior to release. If you are not in the bucket off Reachable, the antnode will terminate with a user friendly message and will not be allowed to join the network.

Note: The logic to determine routable is currently under going extensive testing, and it takes about ~3+ minutes per attempt, and up to a total 3 retry/attempts maybe be performed. Therefore, it can up to ~3+ to 9+ minutes before an antnode actually bootstraps itself to the network if you are publicly reachable/routable.

5 Likes

Running Formicaio on Umbrel. Since doing this update I’m having the issue of Formicaio not being reachable remotely. Not sure if I could access it locally as I’m far from home. I’ve updated everything, including Tailscale on Umbrel and my laptop.

Umbrel stats show appreciable (about what I’d expect) CPU activity for Formicaio, but in Brave, the interface just never populates node data, while in Safari, I get the “The connection to the backend has been lost.” message.

Any insights?

I guess you’ve already tried with refreshing the page using Ctrl + F5 ?

It may be something I’ve experienced a couple of times in the past which I’ll have to try to reproduce and dig deeper. In such case the nodes and Formicaio backend were all running ok for me (I could confirm this by having the Formicaio widget installed and reporting the active nodes and general stats) but I couldn’t get access to the front-end even without Tor from the LAN. It seems sometimes the Umbrel internal proxy it has for auth has some issues when it upgrades the app and restarts it, and I had no choice but to reinstall Formicaio, unless of course, with Ctrl + F5 solves it for you.

My Macbook has the touchbar so F keys are virtual. When I try to combine Fn+Command(or Ctrl) plus the F5, I only get the interface for turning on Voice assist. :upside_down_face: So I can’t execute.

I had a similar thing happen in the past, as I recall and reinstall of Formicaio did the trick. I just hate to have to re-up all the nodes. :smirking_face:

1 Like

Perhaps this works for you: How to Hard Refresh in your browser, on a Mac (Safari, Chrome, Firefox, Opera)

In any case, I’d recommend you to enable the Formicaio widget as that allows you to always see if the nodes are up and running from Umbrel’s home page even when you have this issue.

2 Likes

Formicaio v0.6.1

Formicaio version 0.6.1 has been released and it’s ready for installation across all supported platforms in native mode. Docker containers or UmbrelOS/CasaOS versions won’t be published for this new version for now.

Users currently running nodes in home-network mode (with version 0.5.x or earlier) shouldn’t upgrade to this new version as home-network is not supported in v0.6.x.

This release introduces a first version of a Formicaio MCP server, for AI agents to connect to, which can be kicked off when starting the backend. To enable simply pass the –mcp flag to the formicaio / formicaio.exe start command.

As an illustration, check out the video demonstration which showcases how the Formicaio MCP server can be effectively combined with n8n, an open-source workflow automation tool. It shows an interaction with Formicaio through an AI agent via chat, as well as demonstrates how to schedule a task that monitors CPU usage. Based on the detected CPU capacity on the host, the system can automatically request Formicaio to add or remove nodes, ensuring optimal performance.

This is the AI prompt used in this showcase:

Make sure the CPU usage on the host is below 50%. If it is, add a new node
instance on Formicaio with the same properties as the existing nodes, using a
port number that is one higher than the highest current port. Also, keep the
total number of nodes to 3; if there are more than 3, remove the extra ones.

formicaio_mcp_with_n8n

If this is your first time installing Formicaio, you can easily follow the installation instructions in the README.

Make sure that, after upgrading, you refresh the page of any instance of the Formicaio frontend/GUI you have open on a browser with Ctrl + F5.

13 Likes

I just got back from being on the road all summer. Lost connection to my Umbrel, which I was managing fine up to that point.

I’ve reinstalled and gotten Umbrel running, but can’t seem to get formicaio operational. I connect via the Community App Store but have no way to access the app or get it running as it doesn’t appear on the umbrel desktop. Is this because the new version doesn’t support Umbrel? Is the older binary available or do I need to skip Umbrel for now to use Formicaio and figure how to run native under another Linux os?

Running nodes with Formicaio is SO simple with Umbrel and easy to manage remotely. Will you be accommodating the platform for Umbrel soon?

No, you can still use it on UmbrelOS, there was no change and/or new upgrade to the UmbrelOS version, I’ll give it a try to re install it myself to see if I can repro the issue…

Edit: I just gave it a try uninstall it and reinstalling it, and I got v0.6.2 installed and running just fine. Do you see anything interesting if you go from the dashboard to Settings → Troubleshoot → View Umbrel logs ?

Edit2: I’ve just published the old v0.5.6 as well, which supports home-network mode, you can install that if needed.

The problem is that the repository is there but the app isn’t, so I don’t have a gui to access opening it or even uninstalling it.