Conversation
Add screenshots
Update README formatting and feature list
Added a new section for Login with an image.
Add Login section to README
Updated the login image width in the README.
Increase login image width to 800px
Update README.md
Fix formatting of screenshots section in README
Update README.md
Create docker-publish.yml
Update docker-publish.yml
Add Patreon funding option alongside Buy Me a Coffee
Delete orbit.db
Add stacks, logs, space background
Add stacks, container logs, space background
Update .gitignore to include additional patterns
There was a problem hiding this comment.
Pull request overview
Adds Stack (Docker Compose) management and container log viewing to the Orbit Control dashboard, alongside significant UI styling updates and repository housekeeping.
Changes:
- Added Stacks tab with create/start/stop/restart/remove actions and backend endpoints to manage Compose projects.
- Added container log viewing (UI modal +
/container/<id>/logsendpoint). - Updated UI styling (space background, banners, modal extensions) and added a Docker publish GitHub Actions workflow.
Reviewed changes
Copilot reviewed 6 out of 8 changed files in this pull request and generated 13 comments.
Show a summary per file
| File | Description |
|---|---|
templates/index.html |
Adds new UI elements (space background, GitHub banner) and new modals for stack creation and logs display. |
static/js/dashboard.js |
Implements Stacks UI logic, stack actions, and container logs modal/refresh behavior. |
app.py |
Adds stack discovery and stack lifecycle endpoints, plus a container logs endpoint; bumps app version. |
README.md |
Updates formatting and screenshots section, but now diverges from the implemented features and has HTML/link issues. |
.gitignore |
Adds DB ignore rules, but the DB is still present in the PR and should be removed from tracking. |
.github/workflows/docker-publish.yml |
Adds image build/push workflow. |
.github/FUNDING.yml |
Adds Patreon funding option. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| stack_dir = os.path.join(STACKS_PATH, name) | ||
| os.makedirs(stack_dir, exist_ok=True) | ||
| compose_file = os.path.join(stack_dir, 'docker-compose.yml') | ||
| with open(compose_file, 'w') as f: | ||
| f.write(compose_content) |
There was a problem hiding this comment.
stack_create() uses the user-provided name directly in os.path.join(STACKS_PATH, name) and then writes docker-compose.yml. This allows path traversal (e.g., ../...) or names containing path separators, which can write outside /app/stacks. Validate/sanitize name (e.g., strict regex like [a-z0-9][a-z0-9_-]*), and enforce that the resolved path stays under STACKS_PATH before creating directories/files.
| result = subprocess.run(['docker', 'compose', '-p', name, '-f', compose_file, 'up', '-d'], | ||
| capture_output=True, text=True) | ||
| if result.returncode != 0: |
There was a problem hiding this comment.
stack_create() shells out to docker compose ... up -d via subprocess.run(...) without a timeout and without handling FileNotFoundError when the docker CLI / compose plugin is missing. Given the current runtime image installs only Python deps, this is likely to fail or hang indefinitely. Consider either implementing stack creation via the Docker SDK, or ensure the image includes the Docker CLI + compose plugin and add timeout=... + explicit error handling so the API returns a clear message.
| const res = await fetch('https://api.github.com/repos/TobiMessi/orbit/releases/latest'); | ||
| if (!res.ok) return; | ||
|
|
||
| const data = await res.json(); | ||
| const latestVersion = data.tag_name.replace('v', ''); | ||
|
|
||
| if (latestVersion !== currentVersion) { | ||
| if (latestVersion !== "1.1.0") { |
There was a problem hiding this comment.
checkForUpdate() compares GitHub’s latest tag against a hard-coded version string. This will drift on every release and duplicates VERSION from the backend. Fetch the current version from /api/version and compare against that value instead of embedding it in JS.
| on: | ||
| push: | ||
| branches: [ "main", "add-screenshots" ] # Reaguje na Twoje obecne branche | ||
|
|
There was a problem hiding this comment.
This workflow publishes on pushes to both main and add-screenshots. Publishing images from a non-release branch increases the chance of pushing unreviewed or experimental builds to :latest. Consider limiting to main and/or tags/releases.
|
|
||
| jobs: | ||
| build: | ||
| runs-on: [self-hosted, hp-build] |
There was a problem hiding this comment.
The job runs on a self-hosted runner while using Docker Hub secrets. Self-hosted runners have a larger trust surface than GitHub-hosted runners. If self-hosted is required, consider adding environment protections/approvals and restricting runner access to reduce secret-exposure risk.
| runs-on: [self-hosted, hp-build] | |
| runs-on: ubuntu-latest |
| </details> | ||
|
|
There was a problem hiding this comment.
The screenshots section has an extra closing </details> tag (there’s one closing tag at line 104 and another at line 107). This breaks the HTML structure in the rendered README; remove the redundant closing tag.
| </details> |
| **Monitor and manage your Docker containers, images, volumes, and networks from a beautiful web interface.** | ||
|
|
||
| [Features](#-features) • [Installation](#-installation) • [Usage](#-usage) • [Roadmap](#-roadmap) | ||
|
|
||
| </div> |
There was a problem hiding this comment.
The top-of-README quick links use anchors like #-features / #-installation, but the headings now render to anchors like #features / #installation on GitHub. Update these link targets (or restore previous heading formatting) so the links work.
| 0%, 100% { opacity: 1; } | ||
| 50% { opacity: 0.5; } | ||
| } | ||
|
|
There was a problem hiding this comment.
The new background animations (e.g., twinkle and other infinite animations in this file) don’t respect reduced-motion preferences. Add a @media (prefers-reduced-motion: reduce) override to disable or significantly reduce these animations for accessibility.
| @media (prefers-reduced-motion: reduce) { | |
| .stars, | |
| .stars2, | |
| .planet1, | |
| .planet2 { | |
| animation: none !important; | |
| } | |
| } |
| capture_output=True, text=True) | ||
| os.remove(compose_file) | ||
| try: os.rmdir(stack_dir) | ||
| except: pass |
There was a problem hiding this comment.
Except block directly handles BaseException.
| except: pass | |
| except OSError: pass |
| capture_output=True, text=True) | ||
| os.remove(compose_file) | ||
| try: os.rmdir(stack_dir) | ||
| except: pass |
There was a problem hiding this comment.
'except' clause does nothing but pass and there is no explanatory comment.
| except: pass | |
| except OSError: pass |
No description provided.