Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
d793b72
fix: version name
Jan 5, 2026
a0499fe
update: version inject from tag
Jan 5, 2026
5c7b41b
fix
Jan 5, 2026
2da996f
fix
Jan 5, 2026
bfd7867
fix
Jan 5, 2026
cef41fa
fix
Jan 5, 2026
2b8268a
fix
Jan 5, 2026
d91ebb1
fix
Jan 5, 2026
18d26b7
fix
Jan 5, 2026
1394ff9
fix
Jan 5, 2026
cd95a1c
remove: compile.txt
Jan 5, 2026
5db0905
add: github related files
Jan 5, 2026
36b98cf
add: github related files
Jan 5, 2026
ebcc0ed
update: release version injection
Jan 5, 2026
8b11e73
update: README.md
Jan 5, 2026
7691ef5
remove: old version
Jan 5, 2026
f296809
fix
Jan 5, 2026
d7daa6d
update: bad url in readme
Jan 5, 2026
6cc5ef3
update: bad url in readme
Jan 5, 2026
0ec5e7d
remove: install.sh
Jan 5, 2026
19b6dc7
update: README.md
Jan 6, 2026
ed88776
chore(release): 26.01.1b18
Jan 7, 2026
fdf3049
chore(release): 26.01.1b19
Jan 7, 2026
7769ec9
Merge pull request #1 from Portabase/feature/new-workflows
Asuniia Jan 15, 2026
181da31
chore(release): 26.01.2b1
Jan 15, 2026
be68049
chore(release): 26.01.2b2
Jan 15, 2026
d69da03
chore(release): 26.01.2b3
Jan 15, 2026
3f7638f
chore(release): 26.01.2b4
Jan 15, 2026
28f5a99
chore(release): 26.01.2b5
Jan 15, 2026
540116c
chore(release): 26.01.2b6
Jan 15, 2026
5d4d6d7
chore(release): 26.01.2b7
Jan 15, 2026
3fac2bf
chore(release): 26.01.2
Jan 15, 2026
43e537c
chore(release): 26.01.3
Jan 15, 2026
44ebc1e
chore(release): 26.01.4
Jan 15, 2026
5f61991
chore(release): 26.01.5
Jan 15, 2026
baf9f16
chore(release): 26.01.6
Jan 15, 2026
88ce856
chore(release): 26.01.7
Jan 15, 2026
8356aef
chore(release): 26.01.8
Jan 15, 2026
dabf648
chore(release): 26.01.9
Jan 15, 2026
e442c07
fix: compose.py with snippets code for agent databases.
Jan 27, 2026
508bdef
Merge pull request #4 from Portabase/feat/rust
RambokDev Jan 27, 2026
4fca3a9
Merge branch 'main' into fix/config-flow
Jan 27, 2026
fd71a17
fix: agent.py configuration
Jan 27, 2026
246de2c
chore(release): 26.01.27b1
Jan 27, 2026
f1a6f17
chore(release): 26.01.27
Jan 27, 2026
ed1d8cf
chore(release): 26.01.27
Jan 27, 2026
35890a2
fix: python.yml
Jan 27, 2026
6f9f4b8
chore(release): 26.01.27
Jan 27, 2026
c6e49c3
fix: agent.py
Jan 27, 2026
9a1d157
Merge pull request #5 from Portabase/fix/config-flow
RambokDev Jan 27, 2026
d5004cd
fix: agent.py
Jan 28, 2026
eb5a448
chore(release): 26.02.1
Feb 10, 2026
feba7a9
chore(release): 26.02.2
Feb 10, 2026
2d077f7
chore(release): 26.02.3
Feb 10, 2026
66ea8ca
chore(release): 26.02.4
Feb 10, 2026
338fcb5
chore(release): 26.02.5
Feb 10, 2026
b7d0621
chore(release): 26.02.6
Feb 10, 2026
7255c6a
Merge remote-tracking branch 'origin/main'
Feb 17, 2026
b4b5a9e
fix: dashboard template
Feb 17, 2026
01b59a9
chore(release): 26.02.17
Feb 17, 2026
12d658c
polling
Feb 25, 2026
9932f89
e
Feb 25, 2026
51a61e6
fix
Feb 25, 2026
1219f42
add: mongodb,sqlite,hint
Feb 25, 2026
d1d8db9
Merge pull request #7 from Portabase/feat/hint
Asuniia Mar 25, 2026
e7a8e76
add: redis,valkey
Mar 25, 2026
dd40a1a
Merge branch 'main' into feat/redis-valkey
Mar 25, 2026
5b4c714
fixes
Mar 25, 2026
bbb51b8
chore(release): 26.03.1
Mar 25, 2026
ea86c94
chore(release): 26.03.2
Mar 25, 2026
122057c
add: firebird
Apr 20, 2026
b1fdf60
Merge pull request #9 from Portabase/feat/firebird
Asuniia Apr 20, 2026
5889f36
chore(release): 26.04.1
Apr 20, 2026
074f436
new: selector
May 19, 2026
948b15c
merge: redis,valkey
May 19, 2026
be843f7
add: mssql,more complex password
May 19, 2026
30eb3d6
Merge pull request #10 from Portabase/feat/module
Asuniia May 19, 2026
c00f128
chore(release): 26.05.1
May 19, 2026
c85b0db
fix
Jun 22, 2026
d4e810a
Merge pull request #11 from Portabase/fix/datapath
Asuniia Jun 22, 2026
c911d20
chore(release): 26.06.1
Jun 22, 2026
0299073
add: postgres cluster
Jun 29, 2026
cf14c35
add: warning message
Jun 29, 2026
fd3adfc
Merge pull request #13 from Portabase/feat/postgres-cluster
Asuniia Jun 29, 2026
cb05465
chore(release): 26.06.2
Jun 29, 2026
3a1dc04
fix
Jun 30, 2026
9ef7abb
Merge pull request #14 from Portabase/fix/bugs
Asuniia Jun 30, 2026
ec61d7c
chore(release): 26.06.3
Jun 30, 2026
2a8a3a5
Merge remote-tracking branch 'refs/remotes/origin/main'
Jun 30, 2026
d019917
fix
Jul 1, 2026
5065a18
add: options ownership on postgres
Jul 1, 2026
c516f8f
fix message
Jul 2, 2026
afc294f
add: docker volume
Jul 3, 2026
bc75eef
Merge pull request #15 from Portabase/feat/docker-vol
Asuniia Jul 3, 2026
f074067
chore(release): 26.07.1
Jul 3, 2026
1d10ae6
Add Linux ARM64 CLI binary build (#12)
Antoninj Jul 3, 2026
2e38134
chore(release): 26.07.2
Jul 3, 2026
1379312
fix (#16)
Asuniia Jul 8, 2026
b9b119a
chore(release): 26.07.3
Jul 8, 2026
4cb1d7f
Merge remote-tracking branch 'refs/remotes/origin/main'
Jul 8, 2026
57071de
chore(release): 26.07.4
Jul 8, 2026
5166fc1
add clean option (#18)
Asuniia Jul 27, 2026
4b9f073
chore(release): 26.07.5
Jul 27, 2026
d35bf82
fix
Aug 6, 2026
50e4f23
Merge pull request #19 from Portabase/fix/name-container
Asuniia Aug 6, 2026
858d492
chore(release): 26.07.6
Aug 6, 2026
b375d96
fix
Aug 12, 2026
f611a7f
feat: added CLI option to decrypt backups
Aug 12, 2026
e830dcc
Merge pull request #20 from Portabase/feat/file-decryption
RambokDev Aug 12, 2026
88a865a
chore(release): v26.08.12
Aug 12, 2026
e92dd46
docs: add CLI refactor design spec
Sep 11, 2026
c23839e
docs(spec): shared AddDatabaseFlow, generic engine options, split red…
Sep 11, 2026
8acecd9
docs: add plan 1 (CI hygiene, pinned actions, bump workflow)
Sep 11, 2026
43a9749
docs: add plan 2 (foundations: errors, ui, services, Command; lifecyc…
Sep 11, 2026
a7cf34b
docs: add plan 3 (Jinja2 templates, engine registry, template reposit…
Sep 11, 2026
333db61
docs: add plan 4 (declarative rendering, flag-driven commands, build)
Sep 11, 2026
394b25d
refactoring
Sep 11, 2026
17b56fe
feat(agent): show the proposed configuration and confirm before writing
Sep 11, 2026
d823cde
docs: dashboard settings and auth providers design
Sep 11, 2026
1b31db7
style: name the pre-write panel SUMMARY
Sep 11, 2026
c59cb08
feat!: one namespace per component — agent create, agent db
Sep 11, 2026
6627fc8
feat(dashboard): settings registry, auth providers and lock-out checks
Sep 11, 2026
00d0e79
feat(dashboard): create/show/set/unset and auth add/list/remove
Sep 11, 2026
5e0188c
feat(agent): show/set/unset, and every documented agent variable
Sep 11, 2026
f35b34b
feat(agent): ca_bundle mounts an internal CA and points SSL_CERT_FILE…
Sep 11, 2026
86089dc
refactor(agent): keep only SSL_CERT_FILE in .env; the bundle path liv…
Sep 11, 2026
4658f74
feat(dashboard): end create with a hint on adding OIDC/OAuth providers
Sep 11, 2026
ea37e4e
feat(dashboard): prompt for provider kind and id in auth add/remove
Sep 11, 2026
932b942
chore: drop a leftover comment in main.py
Sep 11, 2026
8d1ef4e
feat(dashboard): prompt for provider kind and id in auth add/remove
Sep 11, 2026
77167e5
add: new cli
Sep 14, 2026
bccb5ab
Merge branch 'main' into feat/refactoring
Sep 14, 2026
47096dd
Merge remote-tracking branch 'origin/feat/refactoring' into feat/refa…
Sep 14, 2026
788e9e5
ci: track the build action, drop SARIF upload, pass gitleaks config v…
Sep 14, 2026
db29462
Create .gitleaksignore
Sep 14, 2026
1b0d326
Update plumber.yml
Sep 14, 2026
2d3356d
Merge pull request #21 from Portabase/feat/refactoring
Asuniia Sep 14, 2026
4f5e6f6
fix
Sep 14, 2026
ced79f0
Merge pull request #24 from Portabase/feat/refactoring
Asuniia Sep 14, 2026
971ac95
chore(release): 26.09.01
github-actions[bot] Sep 14, 2026
79676f9
fix
Sep 14, 2026
c3615f2
Merge pull request #26 from Portabase/feat/refactoring
Asuniia Sep 14, 2026
47013de
chore(release): 26.09.1
github-actions[bot] Sep 14, 2026
9154583
build: replace cryptography with pycryptodome for AES-GCM
Sep 14, 2026
b5ed9b3
Merge pull request #27 from Portabase/feat/refactoring
Asuniia Sep 14, 2026
3f9b8e5
chore(release): 26.09.2
github-actions[bot] Sep 14, 2026
6c5e0ae
add: mongo srv compatibility
Sep 15, 2026
6967a63
fix: satisfy ruff format check in db add command
Copilot Sep 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 128 additions & 0 deletions .github/CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
contact@soluce-technologies.com.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within
the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
261 changes: 261 additions & 0 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,261 @@
---

# Contributing to Portabase

Thank you for considering contributing to **Portabase!** 🎉 Contributions help make this project better for everyone.

Please take a moment to review this guide. It will help you understand how to contribute effectively.

---

## Table of Contents

1. [How to Get Started](#how-to-get-started)
2. [Running the CLI (Development)](#running-the-cli-development)
3. [Reporting Issues](#reporting-issues)
4. [Submitting Changes](#submitting-changes)
5. [Code Style Guidelines](#code-style-guidelines)
6. [Pull Request Process](#pull-request-process)
7. [Community Guidelines](#community-guidelines)

---

## How to Get Started

1. **Fork the repository**
Click the "Fork" button at the top-right corner of this repository.

2. **Clone the repository**
```bash
git clone https://github.com/Portabase/cli.git
```

3. **Set up the development environment**
Follow the steps in the `README.md` to install dependencies and configure the project.

4. **Create a branch**
Use the feature branch to work on changes.
```bash
git checkout -b feature/<feature-name>
```

---

## Running the CLI (Development)

The project is a [Typer](https://typer.tiangolo.com/) CLI managed with
[uv](https://docs.astral.sh/uv/). The entry point is `main.py`.

### Set up the environment

Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then sync
the dependencies (creates `.venv` and installs everything from `uv.lock`):

```bash
uv sync
```

### Run any command from source

While developing, run the CLI through `uv run` instead of the installed
`portabase` binary. The pattern is:

```bash
uv run python main.py <command> [ARGS] [OPTIONS]
```

Anything after `main.py` is a normal CLI invocation, so `portabase <command>`
(once built/installed) and `uv run python main.py <command>` are equivalent.

Show the top-level help and version:

```bash
uv run python main.py --help
uv run python main.py --version
```

> Tip: append `--help` to any command to see its arguments, e.g.
> `uv run python main.py agent --help`.

### Creation commands

Create an agent (interactive; flags pre-fill the prompts):

```bash
# name is required (creates a folder); everything else is optional
uv run python main.py agent my-agent
uv run python main.py agent my-agent --key <EDGE_KEY> --tz Europe/Paris --polling 10 --start
```

| Arg / Option | Default | Description |
| --- | --- | --- |
| `name` (arg) | — | Agent name; creates a folder of that name. |
| `--key`, `-k` | prompt | Edge Key (Base64 or JSON). Prompted if omitted. |
| `--tz` | `UTC` | Timezone. |
| `--polling` | `5` | Polling frequency in seconds. |
| `--start`, `-s` | off | Start the agent immediately after setup. |

Create a dashboard:

```bash
uv run python main.py dashboard my-dashboard
uv run python main.py dashboard my-dashboard --port 9000 --start
```

| Arg / Option | Default | Description |
| --- | --- | --- |
| `name` (arg) | — | Dashboard name; creates a folder of that name. |
| `--port` | `8887` | Web port. |
| `--start`, `-s` | off | Start the dashboard immediately after setup. |

### Lifecycle commands

Each takes the path to a component folder (the one created above):

```bash
uv run python main.py start my-agent
uv run python main.py stop my-agent
uv run python main.py restart my-agent
uv run python main.py logs my-agent # follows by default
uv run python main.py logs my-agent --no-follow
uv run python main.py uninstall my-agent # prompts for confirmation
uv run python main.py uninstall my-agent --force
```

| Command | Arg / Option | Description |
| --- | --- | --- |
| `start` / `stop` / `restart` | `path` (arg) | Path to the component folder. |
| `logs` | `path` (arg), `--follow/--no-follow`, `-f` | Stream logs; follows unless `--no-follow`. |
| `uninstall` | `path` (arg), `--force`, `-f` | Remove containers and data; `--force` skips the prompt. |

### Configuration commands

Decrypt Portabase `.enc` backup files (single file or a folder of `.enc` files):

```bash
# single file -> explicit output
uv run python main.py decrypt backup.tar.gz.enc backup.tar.gz --key master_key.bin
# folder -> decrypt every .enc into an output folder
uv run python main.py decrypt ./backups ./restored --key master_key.bin
# omit output to write next to the input; omit --key to use ./master_key.bin
uv run python main.py decrypt backup.tar.gz.enc
```

| Arg / Option | Default | Description |
| --- | --- | --- |
| `input_path` (arg) | — | A `.enc` file, or a folder containing `.enc` files. |
| `output_path` (arg) | input's directory | Output file or folder (must match the input type). |
| `--key`, `-k` | `./master_key.bin` | Path to the master key file (raw 32-byte or Base64 AES-256 key). |

Manage the configured databases of an agent:

```bash
uv run python main.py db list my-agent
uv run python main.py db add my-agent
uv run python main.py db remove my-agent
```

Manage global CLI configuration:

```bash
uv run python main.py config show
uv run python main.py config channel stable # or: beta
```

### System commands

```bash
uv run python main.py update
```

### Running the tests

Unit tests live in `tests/`, mirroring `core/`, `services/` and `engines/`. They call
the functions directly: no Docker, no network, no built binary.

```bash
uv run pytest
uv run ruff check . && uv run ruff format --check . && uv run mypy
```
---

## Reporting Issues

If you encounter a bug or have a suggestion for improvement, follow these steps:

1. **Check existing issues** to avoid duplicates.
2. **Open a new issue** if needed:
- Provide a clear and descriptive title.
- Describe the issue with steps to reproduce it (if applicable).
- Include relevant logs, screenshots, or code snippets.

---

## Submitting Changes

1. **Ensure your branch is up to date**
```bash
git pull origin main
```

2. **Write meaningful commit messages**
Follow this format:
```
[type] Summary of changes
```
Example:
```
feat: add user authentication
fix: resolve crash on login page
```

3. **Push your branch**
```bash
git push origin feature/<feature-name>
```

4. **Open a Pull Request (PR)**
Go to the repository on GitHub and click "New Pull Request."

---

## Code Style Guidelines

- Follow the [specific coding style guide] (e.g., Prettier, ESLint, PEP8).
- Use meaningful variable names and include comments where necessary.
- Tests before submitting your changes.

---

## Pull Request Process

1. Ensure your code passes all tests and linters.
2. Provide a clear description of what your PR does.
3. Reference any related issues (e.g., `Closes #123`).
4. Wait for a review from a maintainer.

---

## Community Guidelines

- Be respectful and inclusive to all contributors.
- Follow the [Code of Conduct](CODE_OF_CONDUCT.md).
- Feel free to ask questions if you’re unsure about something.

---

Thank you for contributing! 🙌

---
## Releasing

Releases are cut from GitHub Actions, never from a local machine.

1. Open **Actions → Bump version → Run workflow**.
2. Pick the branch (`main` for stable, any branch for a release candidate).
3. Enter the version without a leading `v` (`26.09.0` for stable, `26.09.0rc1` for a candidate) and the matching channel.
4. The workflow commits `chore(release): <version>`, creates the tag and pushes. The tag triggers the build, the GitHub release and the Discord notification.

Stable versions must match `X.Y.Z` and can only be cut from `main`.

The workflow pushes with a token minted from the Portabase GitHub App (`APP_ID` repository variable, `APP_PRIVATE_KEY` secret), scoped to *Contents: write*. The app must be installed on this repository and allowed to push to `main`. A tag pushed with the default `GITHUB_TOKEN` would not trigger the release workflows.
Loading