Docker management app for iOS written in SwiftUI.

Overview

Harbour Logo

Harbour

Docker management app for iOS written in SwiftUI.

Screenshots

Dashboard Detail Mounts Network

Features

  • 100% native and made in SwiftUI
  • Light and Dark Mode
  • Control and inspect containers
  • Display logs
  • Design based on Apple's Human Interface Guidelines
  • iPad app

How to use

Xcode Build Bitrise Status

Installation

  1. Clone the repo.
  2. Open the project in Xcode >= 11.4.
  3. Change the Bundle Identifier and Signing Identity to your own.
  4. Build and run!

Docker setup

Download and install Portainer. Then, login with your profile username and password in Harbour. You can also use any other HTTP-based Docker reverse-proxy, but at this time only Portainer is officially supported.

Known bugs

  • Container view doesn't update when in context menu
  • NavigationView titles sometimes bug

TODO

  • Cursor support
  • Battery optimization
  • Localization
  • Accessibility
  • Shortcuts
  • Fix context menu (properly scale icons, make UI update)
  • Quick actions
  • Allow selection of text in certain views
  • Further optimization
  • Fix NavigationViewTitle size bug
  • CloudKit
  • Stacks support
  • Widget (?)
  • Catalyst app
  • watchOS app
  • Create new containers (+ drag and drop)
  • Edit containers
  • Better logs support (streams)
  • Notifications
  • SiriKit
Comments
  • iOS 14?

    iOS 14?

    Been using Harbour on my iPhone 11 Pro before it was even released as a TestFlight beta (sideloaded from github source). Love this project and happy to see that it's moving towards an app store release. One question though - I'm still on iOS 14 for work reasons, and cannot upgrade to iOS 15 yet. Is there any reason why the TestFlight build requires iOS 15 as the minimum compatible version? Any chance for iOS 14 being supported?

    opened by radiochild577 24
  • The data couldn't be read because it is missing

    The data couldn't be read because it is missing

    Describe the bug App show an error but there aren't any error error: Error! The data couldn't be read because it is missing

    Details

    • Device: 13,2 (12)
    • OS: 15.6
    • Harbour version v2.0.0#7
    • Portainer version [e.g. 2.9.2]

    **Container create command **: docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v portainer_data:/data portainer/portainer-ce

    Screenshots IMG_364313A309FF-1 IMG_81559436CAC1-1

    Bug 
    opened by KovD3v 13
  • Unable to login in the App to Portainer

    Unable to login in the App to Portainer

    Describe the bug Unable to login into the app.

    To Reproduce Steps to reproduce the behavior:

    On LAN, after installing from TestFlight and trying to authenticate I provide Portainer URL (https://192.168.0.100:9000) the portainer admin username and password and all I get is a spinning loader. No error no login.

    Access to Portainer using same credentials and url works fine from a lan browser. Expected behavior Able to login!

    Details (please complete the following information):

    • Device: iPhone 12Pro Max
    • OS: iOS 15.1.1
    • Harbour version: latest from TestFlight
    • Portainer version: latesr

    Container create command (if applicable): e.g. docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

    Additional context Add any other context about the problem here.

    Screenshots If applicable, add screenshots to help explain your problem.

    Bug 
    opened by SemoTech 7
  • Stuck at loading

    Stuck at loading

    Describe the bug Harbour is stuck at loading. When logging off and on again, all working fine. When the app is closed some time and want to reopen, it does not open. Stuck at loading , and on top “refreshing”

    Expected behavior A working refresh and login

    Details (please complete the following information):

    • Device: iPhone 12 Pro
    • OS: ios 15.1
    • Harbour version 2.0.0(4)
    • Portainer version: 2.11.0
    Bug 
    opened by Martinvdm 7
  • Can not load endpoints after login.

    Can not load endpoints after login.

    Describe the bug Can not load endpoints after login. Same issue after every attempt. It looks as if the results returned by the endpoints interface cannot be parsed.

    To Reproduce Steps to reproduce the behavior:

    1. Go to 'Log in' page
    2. Enter the correct url, credentials.
    3. Click on 'Log in'
    4. See error

    Expected behavior A dashboard page of all endpoints after login.

    Details:

    • Device: iPhone 11
    • OS: iOS 15.3
    • Harbour version v2.0.0#5
    • Portainer version 2.11.0

    Additional context In my portainer instance there are three endpoints :

    Endpoints interface return :

    [
      {
        "Id": 1,
        "Name": "hass.io",
        "Type": 1,
        "URL": "unix:///var/run/docker.sock",
        "GroupId": 1,
        "PublicURL": "",
        "TLSConfig": {
          "TLS": false,
          "TLSSkipVerify": false
        },
        "Extensions": [],
        "AzureCredentials": {
          "ApplicationID": "",
          "TenantID": "",
          "AuthenticationKey": ""
        },
        "TagIds": [],
        "Status": 1,
        "Snapshots": [
          {
            "Time": 1643508346,
            "DockerVersion": "20.10.9",
            "Swarm": false,
            "TotalCPU": 2,
            "TotalMemory": 2076291072,
            "RunningContainerCount": 14,
            "StoppedContainerCount": 0,
            "HealthyContainerCount": 0,
            "UnhealthyContainerCount": 0,
            "VolumeCount": 0,
            "ImageCount": 23,
            "ServiceCount": 0,
            "StackCount": 0,
            "DockerSnapshotRaw": {
              "Containers": null,
              "Volumes": null,
              "Networks": null,
              "Images": null,
              "Info": null,
              "Version": null
            },
            "NodeCount": 0
          }
        ],
        "UserAccessPolicies": {},
        "TeamAccessPolicies": {},
        "EdgeKey": "",
        "EdgeCheckinInterval": 5,
        "Kubernetes": {
          "Snapshots": [],
          "Configuration": {
            "UseLoadBalancer": false,
            "UseServerMetrics": false,
            "StorageClasses": [],
            "IngressClasses": [],
            "RestrictDefaultNamespace": false
          }
        },
        "ComposeSyntaxMaxVersion": "3.9",
        "SecuritySettings": {
          "allowBindMountsForRegularUsers": true,
          "allowPrivilegedModeForRegularUsers": true,
          "allowVolumeBrowserForRegularUsers": false,
          "allowHostNamespaceForRegularUsers": true,
          "allowDeviceMappingForRegularUsers": true,
          "allowStackManagementForRegularUsers": true,
          "allowContainerCapabilitiesForRegularUsers": true,
          "allowSysctlSettingForRegularUsers": true,
          "enableHostManagementFeatures": false
        },
        "LastCheckInDate": 0,
        "AuthorizedUsers": null,
        "AuthorizedTeams": null,
        "Tags": null
      },
      {
        "Id": 4,
        "Name": "cloud",
        "Type": 4,
        "URL": "http://127.0.0.1:0",
        "GroupId": 1,
        "PublicURL": "xxx.xxx",
        "TLSConfig": {
          "TLS": false,
          "TLSSkipVerify": false
        },
        "Extensions": [],
        "AzureCredentials": {
          "ApplicationID": "",
          "TenantID": "",
          "AuthenticationKey": ""
        },
        "TagIds": [],
        "Status": 1,
        "Snapshots": [
          {
            "Time": 1643450007,
            "DockerVersion": "20.10.12",
            "Swarm": false,
            "TotalCPU": 1,
            "TotalMemory": 2083811328,
            "RunningContainerCount": 4,
            "StoppedContainerCount": 1,
            "HealthyContainerCount": 0,
            "UnhealthyContainerCount": 0,
            "VolumeCount": 2,
            "ImageCount": 8,
            "ServiceCount": 0,
            "StackCount": 1,
            "DockerSnapshotRaw": {
              "Containers": null,
              "Volumes": null,
              "Networks": null,
              "Images": null,
              "Info": null,
              "Version": null
            },
            "NodeCount": 0
          }
        ],
        "UserAccessPolicies": {},
        "TeamAccessPolicies": {},
        "EdgeID": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxx",
        "EdgeKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "EdgeCheckinInterval": 5,
        "Kubernetes": {
          "Snapshots": [],
          "Configuration": {
            "UseLoadBalancer": false,
            "UseServerMetrics": false,
            "StorageClasses": [],
            "IngressClasses": [],
            "RestrictDefaultNamespace": false
          }
        },
        "ComposeSyntaxMaxVersion": "3.9",
        "SecuritySettings": {
          "allowBindMountsForRegularUsers": true,
          "allowPrivilegedModeForRegularUsers": true,
          "allowVolumeBrowserForRegularUsers": false,
          "allowHostNamespaceForRegularUsers": true,
          "allowDeviceMappingForRegularUsers": true,
          "allowStackManagementForRegularUsers": true,
          "allowContainerCapabilitiesForRegularUsers": true,
          "allowSysctlSettingForRegularUsers": true,
          "enableHostManagementFeatures": true
        },
        "LastCheckInDate": 1643508545,
        "AuthorizedUsers": null,
        "AuthorizedTeams": null,
        "Tags": null
      },
      {
        "Id": 5,
        "Name": "nas",
        "Type": 2,
        "URL": "tcp://192.168.2.225:9001",
        "GroupId": 1,
        "PublicURL": "192.168.2.225",
        "TLSConfig": {
          "TLS": true,
          "TLSSkipVerify": true
        },
        "Extensions": [],
        "AzureCredentials": {
          "ApplicationID": "",
          "TenantID": "",
          "AuthenticationKey": ""
        },
        "TagIds": [],
        "Status": 1,
        "Snapshots": [
          {
            "Time": 1643508346,
            "DockerVersion": "20.10.3",
            "Swarm": false,
            "TotalCPU": 2,
            "TotalMemory": 10272227328,
            "RunningContainerCount": 7,
            "StoppedContainerCount": 4,
            "HealthyContainerCount": 1,
            "UnhealthyContainerCount": 0,
            "VolumeCount": 1,
            "ImageCount": 11,
            "ServiceCount": 0,
            "StackCount": 0,
            "DockerSnapshotRaw": {
              "Containers": null,
              "Volumes": null,
              "Networks": null,
              "Images": null,
              "Info": null,
              "Version": null
            },
            "NodeCount": 0
          }
        ],
        "UserAccessPolicies": {},
        "TeamAccessPolicies": {},
        "EdgeKey": "",
        "EdgeCheckinInterval": 5,
        "Kubernetes": {
          "Snapshots": [],
          "Configuration": {
            "UseLoadBalancer": false,
            "UseServerMetrics": false,
            "StorageClasses": [],
            "IngressClasses": [],
            "RestrictDefaultNamespace": false
          }
        },
        "ComposeSyntaxMaxVersion": "3.9",
        "SecuritySettings": {
          "allowBindMountsForRegularUsers": true,
          "allowPrivilegedModeForRegularUsers": true,
          "allowVolumeBrowserForRegularUsers": false,
          "allowHostNamespaceForRegularUsers": true,
          "allowDeviceMappingForRegularUsers": true,
          "allowStackManagementForRegularUsers": true,
          "allowContainerCapabilitiesForRegularUsers": true,
          "allowSysctlSettingForRegularUsers": true,
          "enableHostManagementFeatures": false
        },
        "LastCheckInDate": 0,
        "AuthorizedUsers": null,
        "AuthorizedTeams": null,
        "Tags": null
      }
    ]
    
    Bug 
    opened by john5du 5
  • Self-Signed Certificates support

    Self-Signed Certificates support

    I run Portainer with a self-signed SSL certificate. Would be handy to have an option (defaulted to "off") for ignoring certificate validation errors. I can't currently use Harbour because of this.

    Bug 
    opened by cpwood 3
  • Selecting an option for a container only works briefly

    Selecting an option for a container only works briefly

    First off thanks for making this open source! The design is fantastic, it feels more useful, in a lot of ways, than Portainer because it's less intimidating and has a very crisp UI.

    Describe the bug Whenever I select a container, then select one of the four options near the top (Mounts, Config, Network, or Logs), it successfully loads that screen, but after 1-5 seconds it kicks me out of that screen, back to the container view. ~~Here's a screen recording of the behavior~~ That link seems broken, try this instead

    Additionally, and this is much more minor, but in the settings menu, when I click on the first option, which is the dropdown with my server name, it shows two identical instances of the server, and shows that they're both "in use". Screenshot

    To Reproduce Steps to reproduce the behavior:

    1. Select any active container from the main menu
    2. Select either "Mounts", "Network", "Config", or "Logs"
    3. Wait

    Expected behavior Allow browsing of these menus

    Details (please complete the following information):

    • Device: iPhone 12 Pro Max
    • OS: iOS 15.4.1
    • Harbour version v2.0.0#7 (Tried both TestFlight and Sideloaded)
    • Portainer version 2.14.1
    opened by kylefmohr 2
  • Widgets for container status

    Widgets for container status

    Is your feature request related to a problem? Please describe. Not related to any problem.

    Describe the solution you'd like Widgets that show container status (online, stopped, crashed, whatever portainer knows)

    Unrelated Not sure if it's on the feature list, but ram/cpu usage per container as well

    Enhancement 
    opened by Nahydrin 2
  • Container details for type 2 do not load properly.

    Container details for type 2 do not load properly.

    Describe the bug Container details for type 2 do not load properly, only the log tab loads properly.

    Details:

    • Device: iPhone 11
    • OS: iOS 15.3
    • Harbour version v2.0.0#6
    • Portainer version 2.11.1

    Screenshots

    image

    Bug 
    opened by john5du 1
  • Expire TestFlight IOS

    Expire TestFlight IOS

    Hi,

    Hopefully you are already aware but the TestFlight version is going to expire in 9 days.

    Is there maybe a new version with lots of goodies?

    Many thanks

    opened by thisiscrazy2701 1
  • The log cannot be displayed in Chinese

    The log cannot be displayed in Chinese

    Describe the bug

    The log cannot be displayed in Chinese.

    Details (please complete the following information):

    • Device: iPhone13
    • OS: ios16.beta6
    • Harbour version v2.0.0
    • Portainer version 2.9.2

    Container create command (if applicable): e.g. docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

    Screenshots image

    Bug 
    opened by WuhanSy 0
  • Update/pull images

    Update/pull images

    Describe the solution you'd like The ability to manually update/recreate/repull images.

    Describe alternatives you've considered Using the Portainer UI on mobile, which is definitely not ideal.

    Enhancement 
    opened by Nojwe 0
  • The data couldn't be read because it isn't in the correct format.

    The data couldn't be read because it isn't in the correct format.

    Describe the bug Login with "The data couldn't be read because it isn't in the correct format" error.

    To Reproduce

    1. Fill in portainer URL and access token
    2. Click on login button
    3. See error

    Expected behavior Can successfully login

    Details (please complete the following information):

    • Device: iPhone 13 Pro
    • OS: iOS 16.1
    • Harbour version: lastest from Testflight
    • Portainer version: lastest

    Screenshots IMG_9880

    Bug 
    opened by ted1ore1ee 11
  • "At-A-Glance" Type Views

    The default container view of all stopped/running containers does not give the viewer any sense of context. Are all services healthy? Are all services up (i.e. 1/1, 3/3, or 9/9)? Is the environment good?

    In the container world, I don't care about containers. Kittens vs Cattle. I want to know the environment is healthy, if the stacks are running, if the services are fully scheduled. That's "green" to me.

    If I care about a container or diving deep, then let me drill down, but I feel my first layer view should tell me all the things I need to know. Seeing a list of containers, both stopped and running is confusing to know if "my environment is healthy or not". A list of containers is only useful when I have less than 5 containers and I know and care for all of them (kittens). In a "cattle" environment, I care about stacks, services, and health checks. I can't remember the names of all 36 of my running containers.

    The stack details view has all the information I need to know I'm good.

    image

    All of my services are fully scheduled (1/1 and 3/3), and the last update was what I expected it to be. I don't need to look at any container because I know everything is up.

    Enhancement 
    opened by jnovack 0
  • ANSI Console Colors in Container Logs

    ANSI Console Colors in Container Logs

    The Container logs are printed raw into the UI.

    If logs contains ANSI Console Colors they are printed, instead the should be colored in the color of the color code.

    Ohne Titel

    normally it should by like this Bildschirmfoto 2022-03-30 um 17 59 55

    Enhancement 
    opened by ExtremTechniker 1
  • Error

    Error "Invalid URL" with correct Portainer URL

    Describe the bug I am entering my Portainer endpoint which is located at https://my.domain.com/portainer/ (trailing slash is important here) and add my credentials to login. I get the error message "Invalid URL" even though the endpoint works and I can login at that URL in the browser.

    To Reproduce Steps to reproduce the behavior: Login with an external HTTPS Portainer URL and subpath e.g. /portainer/ that ends in a trailing slash

    Expected behavior I should be able to login with my external URL

    Details (please complete the following information):

    • Device: iPhone 12 Pro
    • OS: iOS 15.3.1
    • Harbour version v2.0.0#5
    • Portainer version 2.11.1

    Additional context If I enter the address without "https://" I get an endlessly spinning circle. If I enter my internal Container IP address and Port http://xxx.xxx.xxx.xxx:9000 I can login.

    The Container is deployed normally with a docker compose file and exposed via Traefik. Though my current setup explicitly needs the URL to end in /portainer/ with the trailing slash.

    Bug 
    opened by Tech-Non 2
Releases(v3.0.0-5)
A simple Student Management on an iOS App

Student Management XCode Swift App A simple Student Management on an Xcode Swift App Table of Contents About the projects Technologies Features Setup

Long Ta 0 Dec 3, 2021
Event management iOS app for organizers using Open Event Platform

Open Event Organizer iOS App Event management app for organizers using Open Event Platform Roadmap Make the app functionality and UI/UX similar to the

FOSSASIA 1.5k Dec 29, 2022
Aquarium Life is an iPhone app for management of Home Aquariums

Aquarium life Aquarium Life is an iPhone app for management of Home Aquariums. The app was launched on Apple App Store in 2021 but removed after my me

Sahil Satralkar 3 Apr 11, 2022
Trello-style Task Management App

Krello Trello-style Task Management App 기한: 2022.05.04 ~ 05.20 (13일) 프로젝트에 대한 자세한 내용은 ?? Notion 에서 확인할 수 있습니다 앱 소개 Trello 의 기능을 따라 할일을 관리하는 iOS Applic

bumgeun 3 May 26, 2022
An application on the iPad for people who cook. It comes with features such as smart recipes, recipe management and ingredient inventory tracking.

ChopChop ChopChop is an application on the iPad for people who cook. It comes with features such as smart recipes, recipe management and ingredient in

Seow Alex 0 Dec 23, 2021
IOS15-SwiftUI-InAppPurchaseDemo - In-App Purchase Demo app written with SwiftUI

iOS15-SwiftUI-InAppPurchaseDemo In-App Purchase Demo app written with SwiftUI If

null 5 Jul 20, 2022
Todo is an iOS App written in Swift. This app is used for an online video training course. This app demonstrates how to use UITableViewController.

Todo Todo is an iOS App written in Swift. This app is used for an online video training course. This app demonstrates how to use UITableViewController

Jake Lin 273 Dec 29, 2022
Simple iOS app written with SwiftUI (and, of course, Swift) to begin exploring it.

WishList Tracking: An exploration with SwiftUI Simple iOS app written with SwiftUI (and, of course, Swift) to begin exploring it. Goal: Get used to Vi

null 0 Dec 26, 2021
A open source Swift app for iOS 13 that allows you to check your NFC transit card information. Written with SwiftUI.

ABANDONED Metrodroid, which TransitPal was heavily inspired by, now has its own fully functional iOS app! It should be in the App Store "soon". I stro

Robbie Trencheny 132 Jun 30, 2022
📱 An app fully written in SwiftUI showcasing beautiful design and animations.

DesignCode DesignCode is an app fully built using Apple's latest SwiftUI and Combine framework. Beautifully written code that is well intended for eas

Mithun 704 Jan 3, 2023
Recipes app written in SwiftUI using Single State Container

swiftui-recipes-app Recipes app is written in SwiftUI using Single State Container This app implemented as an example of a Single State Container conc

Majid Jabrayilov 512 Dec 31, 2022
A native SoundCloud app for macOS, written in SwiftUI

Nuage A native SoundCloud app for macOS, written in SwiftUI About Nuage is an independent and open-source project to build a native SoundCloud client

Laurin Brandner 203 Dec 30, 2022
A directory demo app written with SwiftUI, Core Data, and Alamofire

Directory-SwiftUI A directory demo app written with SwiftUI, Core Data, and Alamofire Getting Started Clone (or fork) this repo: git clone git@github.

Harold Martin 13 Dec 23, 2022
Stopwatches - Simple multiple stopwatch app written in SwiftUI

Stopwatches ⏱️ ⏱️ ⏱️ Log the time you take to do something. Use it for studying,

Federico 5 May 31, 2022
Finance App written in Swift and SwiftUI

Finance App written in Swift and SwiftUI. Modular MVVM architecture (SPM) with Composition Root.

Alexander Tereshkov 7 Nov 18, 2022
iAppStroe is an Apple Store tool app written in SwiftUI.

iAppStore 简介 iAppStroe 是一款使用 SwiftUI 打造的苹果商店工具类 App。 1、提供苹果实时榜单查询,包含 iOS 和 iPad 的热门免费榜、热门付费榜、畅销榜,还有新上架榜、新上架免费榜、新上架付费榜等。 2、提供查询 app 详细页面内容、搜索 app、订阅 ap

37iOSTeam 272 Dec 30, 2022
small iOS & ipadOS application written in SwiftUI and Combine, that fetches twitter users and tweets using Twitter's api

HomeTwitter Small iOS & ipadOS application written in SwiftUI and Combine, that fetches twitter users and tweets using Twitter's api. This is just a s

Sorin Miroiu 1 May 13, 2022
macOS application written in SwiftUI that downloads installer pkgs for the Install macOS Big Sur application.

Download Full Installer This is a Swift UI implementation of my fetch-installer-pkg script. It will list the full macOS Big Sur (and later) installer

Armin Briegel 654 Dec 31, 2022
A xkcd client written in SwiftUI.

xkcd A xkcd client written in SwiftUI. Architechture: Tried to use MVVM but with CoreData... If you know, you know. Features: Supports Dark/Light mode

Sina Rabiei 10 Oct 21, 2022