Skip to content

Commit 3efec11

Browse files
committed
Merge branch 'docs/issue-32-improve-documentation'
2 parents b57eb55 + cabcd1d commit 3efec11

11 files changed

Lines changed: 115 additions & 67 deletions

docs/configuration.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Cronboard is built on [Textual](https://textual.textualize.io), which ships with
2121

2222
The active theme is saved automatically whenever you change it inside the application. The default theme is **`catppuccin-mocha`**.
2323

24-
To change the theme, use Textual's built-in theme picker (accessible via the command palette with `Ctrl+P``theme`).
24+
To change the theme, open the command palette with **`Ctrl+P`** (or **`Ctrl+E`** on some setups), type `theme`, and choose a theme. Your choice is written to `config.toml` so it persists across restarts.
2525

2626
### `config.toml` example
2727

docs/features/local-cron.md

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,63 @@
11
# Local Cron Management
22

3-
The **Local** tab shows all cron jobs for the currently logged-in user. Cronboard reads and writes your crontab directly.
3+
The **Local** tab shows all cron jobs for the currently logged-in user. Cronboard reads and writes your crontab directly, so what you see in the table matches what `crontab -l` shows. Any change you make (create, edit, delete, pause) is written to your user crontab immediately.
44

55
---
66

77
## Viewing Cron Jobs
88

99
All jobs are displayed in a table with the following columns:
1010

11-
| Column | Description |
12-
|---|---|
13-
| ID | Comment attached to the job (used as identifier) |
14-
| Expression | Raw cron expression |
15-
| Command | Shell command to execute |
16-
| Last Run | Previous scheduled execution time |
17-
| Next Run | Next scheduled execution time |
18-
| Status | `Active` (green), `Paused` (red), or `Inactive` (yellow) |
11+
| Column | Description |
12+
| ---------- | -------------------------------------------------------- |
13+
| ID | Comment attached to the job (used as identifier) |
14+
| Expression | Raw cron expression |
15+
| Command | Shell command to execute |
16+
| Last Run | Previous scheduled execution time |
17+
| Next Run | Next scheduled execution time |
18+
| Status | `Active` (green), `Paused` (red), or `Inactive` (yellow) |
19+
20+
The table is read from your crontab when you open the app or when you press **`r`** to refresh. If you edit the crontab in another terminal, refresh in Cronboard to see the updates.
1921

2022
---
2123

2224
## Creating a Cron Job
2325

24-
Press **`c`** to open the creation form.
26+
Press **`c`** to open the creation form. The form is the same for both new jobs and edits (when you press **`e`** on an existing job).
27+
28+
![Create cron job form with Expression, Command, and ID fields and live human-readable description](../images/create-job.gif)
2529

2630
### Fields
2731

28-
| Field | Description |
29-
|---|---|
30-
| Expression | A valid cron expression or special alias (see below) |
31-
| Command | The shell command to run. Supports path autocompletion with `Tab` |
32-
| ID | A unique identifier stored as a crontab comment |
32+
| Field | Description |
33+
| ---------- | ----------------------------------------------------------------- |
34+
| Expression | A valid cron expression or special alias (see below) |
35+
| Command | The shell command to run. Supports path autocompletion with `Tab` |
36+
| ID | A unique identifier stored as a crontab comment |
3337

3438
### Cron expression cheatsheet
3539

36-
| Symbol | Meaning |
37-
|---|---|
38-
| `*` | Any value |
39-
| `,` | Value list separator (e.g. `1,3,5`) |
40-
| `-` | Range of values (e.g. `1-5`) |
41-
| `/` | Step values (e.g. `*/5`) |
40+
| Symbol | Meaning |
41+
| ------ | ----------------------------------- |
42+
| `*` | Any value |
43+
| `,` | Value list separator (e.g. `1,3,5`) |
44+
| `-` | Range of values (e.g. `1-5`) |
45+
| `/` | Step values (e.g. `*/5`) |
4246

4347
Format: `Minute Hour Day Month Weekday`
4448

4549
### Special aliases
4650

47-
| Alias | Equivalent | Description |
48-
|---|---|---|
49-
| `@reboot` || Run once at startup |
50-
| `@hourly` | `0 * * * *` | Every hour |
51-
| `@daily` / `@midnight` | `0 0 * * *` | Every day at midnight |
52-
| `@weekly` | `0 0 * * 0` | Every Sunday at midnight |
53-
| `@monthly` | `0 0 1 * *` | First day of each month |
51+
| Alias | Equivalent | Description |
52+
| ----------------------- | ----------- | -------------------------- |
53+
| `@reboot` | | Run once at startup |
54+
| `@hourly` | `0 * * * *` | Every hour |
55+
| `@daily` / `@midnight` | `0 0 * * *` | Every day at midnight |
56+
| `@weekly` | `0 0 * * 0` | Every Sunday at midnight |
57+
| `@monthly` | `0 0 1 * *` | First day of each month |
5458
| `@yearly` / `@annually` | `0 0 1 1 *` | Once a year on January 1st |
5559

56-
As you type the expression, a **live description** is shown below the field (e.g. *"At 00:00 on day-of-month 1"*).
60+
As you type the expression, a **live description** is shown below the field (e.g. _"At 00:00 on day-of-month 1"_). Use it to confirm the schedule before saving.
5761

5862
---
5963

@@ -63,6 +67,8 @@ As you type the expression, a **live description** is shown below the field (e.g
6367
2. Press **`e`** to open the edit form — pre-filled with the current values.
6468
3. Modify the fields and press **Save**.
6569

70+
The job is updated in your crontab and the table refreshes.
71+
6672
---
6773

6874
## Deleting a Cron Job
@@ -71,6 +77,8 @@ As you type the expression, a **live description** is shown below the field (e.g
7177
2. Press **`D`** (uppercase).
7278
3. Confirm the deletion in the confirmation dialog.
7379

80+
The job is removed from your crontab. This cannot be undone from within Cronboard, so use with care.
81+
7482
---
7583

7684
## Pausing and Resuming
@@ -80,8 +88,10 @@ Press **`p`** on a selected job to toggle its active state:
8088
- **Active → Paused**: the job is commented out in the crontab and will not run.
8189
- **Paused → Active**: the job is uncommented and resumes its schedule.
8290

91+
Pausing is useful when you want to keep the job definition but temporarily disable it (e.g. for debugging or maintenance) without losing the expression or command.
92+
8393
---
8494

8595
## Refreshing
8696

87-
Press **`r`** to reload the crontab from disk at any time.
97+
Press **`r`** to reload the crontab from disk at any time. Use this if you changed the crontab outside Cronboard or if you want to see the latest state after an external edit.

docs/features/remote-servers.md

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Remote Servers (SSH)
22

3-
Cronboard can connect to remote servers via SSH and manage their cron jobs exactly like local ones.
3+
Cronboard can connect to remote servers via SSH and manage their cron jobs exactly like local ones. You use the same keyboard shortcuts and forms; the only difference is that changes are applied to the remote user’s crontab instead of your local one.
44

55
---
66

@@ -10,28 +10,30 @@ Cronboard can connect to remote servers via SSH and manage their cron jobs exact
1010
2. Press **`a`** to open the **Add Server** dialog.
1111
3. Fill in the fields:
1212

13-
| Field | Description |
14-
|---|---|
15-
| Hostname | Server hostname or IP. Append `:port` for a non-standard port (e.g. `myserver.com:2222`). Defaults to port `22`. |
16-
| Username | SSH login username |
17-
| Password | Leave empty to use an SSH key instead |
13+
| Field | Description |
14+
| ------------ | ------------------------------------------------------------------------------------------------------------------- |
15+
| Hostname | Server hostname or IP. Append `:port` for a non-standard port (e.g. `myserver.com:2222`). Defaults to port `22`. |
16+
| Username | SSH login username |
17+
| Password | Leave empty to use an SSH key instead |
1818
| Crontab user | Optional. Manage cron jobs for a different user (requires `sudo` permissions). Leave empty to use the current user. |
1919

2020
4. Click **Add Server**.
2121

22-
Servers are saved persistently in `~/.config/cronboard/servers.toml`. Passwords are stored encrypted.
22+
Servers are saved persistently in `~/.config/cronboard/servers.toml`. Passwords are stored encrypted (bcrypt), never in plain text.
23+
24+
![Add Server dialog with Hostname, Username, Password, and Crontab user fields](../images/remote-connect.gif)
2325

2426
---
2527

2628
## SSH Key Authentication
2729

28-
If you leave the **Password** field empty, Cronboard will connect using your SSH key. It looks for the `known_hosts` file in the default location:
30+
If you leave the **Password** field empty, Cronboard will connect using your SSH key. It looks for keys and the `known_hosts` file in the default location:
2931

3032
```
31-
~/.ssh/known_hosts
33+
~/.ssh/
3234
```
3335

34-
Make sure the server's host key is already trusted (i.e. you have connected to it manually at least once).
36+
Make sure the server's host key is already trusted (i.e. you have connected to it at least once, e.g. with `ssh user@host` from the terminal). That way the first connection from Cronboard won’t prompt for host key confirmation.
3537

3638
---
3739

@@ -44,17 +46,19 @@ Once connected, the cron table for that server appears on the right and supports
4446

4547
- **Create** (`c`), **Edit** (`e`), **Delete** (`D`), **Pause** (`p`), **Refresh** (`r`), **Search** (`/`)
4648

49+
You can only be connected to one server at a time. To work on another server, disconnect with **`d`** first, then connect to the other.
50+
4751
---
4852

4953
## Managing Another User's Cron Jobs
5054

51-
If you entered a **Crontab user** when adding the server, Cronboard will run `crontab -u <user>` on the remote server. This requires your SSH user to have `sudo` (or equivalent) privileges on the remote machine.
55+
If you entered a **Crontab user** when adding the server, Cronboard will run `crontab -u <user>` on the remote server. This requires your SSH user to have `sudo` (or equivalent) privileges on the remote machine so it can act on behalf of that user.
5256

5357
---
5458

5559
## Disconnecting
5660

57-
Press **`d`** to disconnect from the current server. The tree view remains intact so you can reconnect later.
61+
Press **`d`** to disconnect from the current server. The tree view remains intact so you can reconnect later. Your crontab changes on the server are already saved; disconnecting does not discard them.
5862

5963
---
6064

@@ -63,4 +67,4 @@ Press **`d`** to disconnect from the current server. The tree view remains intac
6367
1. Navigate to the server in the tree view.
6468
2. Press **`D`** (uppercase) and confirm.
6569

66-
This removes the server from both the tree view and the saved configuration file.
70+
This removes the server from both the tree view and the saved configuration file. It does not remove any cron jobs on the remote server; it only removes the saved connection details from your machine.

docs/features/search.md

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Search
22

3-
Cronboard includes a built-in search feature that lets you quickly find cron jobs by keyword.
3+
Cronboard includes a built-in search feature that lets you quickly find cron jobs by keyword. It’s useful when you have many jobs and want to jump to one that matches a script name, ID, or expression.
44

55
---
66

@@ -14,28 +14,32 @@ The search is **case-insensitive** and matches against:
1414
- Cron **expression**
1515
- **Command**
1616

17+
For example, typing `backup` will match any job whose ID, expression, or command contains “backup”. You don’t need to type the whole word; partial matches count.
18+
19+
![Search prompt open with a query; matching table rows highlighted and next/previous match navigation](../images/search.gif)
20+
1721
---
1822

1923
## Navigating Matches
2024

21-
After a search is performed, matching rows are highlighted in **bold yellow**.
25+
After a search is performed, matching rows are highlighted in **bold yellow**. If there is more than one match, move between them with the keys below.
2226

23-
| Key | Action |
24-
|---|---|
25-
| `n` | Jump to the **next** match |
27+
| Key | Action |
28+
| --- | ------------------------------ |
29+
| `n` | Jump to the **next** match |
2630
| `N` | Jump to the **previous** match |
2731

28-
A notification shows the total number of matches found (e.g. *"3 match(es) for 'backup'"*).
32+
A notification shows the total number of matches found (e.g. _"3 match(es) for 'backup'"_). If there are no matches, you’ll see a message saying so and the table stays unchanged.
2933

3034
---
3135

3236
## Clearing a Search
3337

34-
Press **`Escape`** to clear the current search and restore the table to its normal view.
38+
Press **`Escape`** to clear the current search and restore the table to its normal view. You can also start a new search by pressing **`/`** again and typing a different query.
3539

3640
---
3741

3842
## Notes
3943

40-
- Search works in both the **Local** tab and on **Remote Server** tables.
41-
- The table must have at least one row for search to be available.
44+
- Search works in both the **Local** tab and on **Remote Server** tables. The behavior is the same in both.
45+
- The table must have at least one row for search to be available. If the table is empty, the search shortcut may not open the prompt.

docs/getting-started.md

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,18 @@ After [installing](installation.md), start the application with:
88
cronboard
99
```
1010

11+
The app reads your user crontab on startup. If you have no cron jobs yet, the table will be empty; you can add your first job in a few steps (see [Your First Cron Job](#your-first-cron-job)).
12+
1113
---
1214

1315
## Interface Overview
1416

15-
When Cronboard opens you will see:
17+
When Cronboard opens you will see a single window with a header, tab bar, main table, and footer. The layout is fixed so you always know where to look.
18+
19+
![Cronboard interface with header, Local and Servers tabs, and the main cron job table](images/interface-overview.gif)
1620

17-
- **Header** — shows the app name and current version.
18-
- **Tab bar** — switch between **Local** (your local cron jobs) and **Servers** (remote SSH servers).
21+
- **Header** — shows the app name and current version. Useful to confirm you’re running the version you expect.
22+
- **Tab bar** — switch between **Local** (your local cron jobs) and **Servers** (remote SSH servers). Only one tab is active at a time; the main table shows the jobs for the active tab.
1923
- **Main table** — lists all cron jobs with the following columns:
2024

2125
| Column | Description |
@@ -27,32 +31,36 @@ When Cronboard opens you will see:
2731
| Next Run | When the job will run next |
2832
| Status | `Active`, `Paused`, or `Inactive` |
2933

30-
- **Footer** — displays all available keyboard bindings for the current context.
34+
- **Footer** — displays all available keyboard bindings for the current context. The bindings change depending on whether you’re in the table, a form, or the Servers panel, so it’s worth glancing at the footer when you switch context.
3135

3236
---
3337

3438
## Your First Cron Job
3539

36-
1. Press **`c`** to open the **Create** form.
37-
2. Enter a valid cron expression in the **Expression** field.
38-
As you type, a human-readable description appears below the field in real time (e.g. *"Every hour"*).
39-
3. Enter the **Command** to execute. Use **`Tab`** to autocomplete file paths.
40-
4. Give the job a unique **ID** (stored as a crontab comment).
40+
Creating a job is the main way to get started. The flow is the same for local and remote (after connecting to a server).
41+
42+
1. Press **`c`** to open the **Create** form. The form has three fields: Expression, Command, and ID.
43+
2. Enter a valid cron expression in the **Expression** field (e.g. `0 * * * *` for every hour).
44+
As you type, a human-readable description appears below the field in real time (e.g. *"Every hour"*). This helps you confirm the schedule before saving.
45+
3. Enter the **Command** to execute. Use **`Tab`** to autocomplete file paths so you don’t have to type full paths by hand.
46+
4. Give the job a unique **ID** (stored as a crontab comment). The ID helps you recognize the job in the table and in raw `crontab -l` output.
4147
5. Press **Save**.
4248

43-
The table refreshes automatically and your new job appears immediately.
49+
The table refreshes automatically and your new job appears immediately. No need to restart the app.
50+
51+
![Creating a new cron job: the Create form with Expression, Command, and ID fields and live description](images/create-job.gif)
4452

4553
---
4654

4755
## Switching Between Local and Remote
4856

4957
Use the **`Tab`** key to switch focus between panels, or click the **Local** / **Servers** tabs at the top.
5058

51-
- **Local** — manages your current user's crontab.
52-
- **Servers** — lists saved SSH servers. See [Remote Servers](features/remote-servers.md) for setup.
59+
- **Local** — manages your current user's crontab. Changes are written directly to your system crontab.
60+
- **Servers** — lists saved SSH servers. Add servers once; they’re stored in config so you can reconnect anytime. See [Remote Servers](features/remote-servers.md) for setup and connecting.
5361

5462
---
5563

5664
## Quitting
5765

58-
Press **`q`** or **`Ctrl+Q`** to exit Cronboard.
66+
Press **`q`** or **`Ctrl+Q`** to exit Cronboard. Your crontab (and any remote crontabs you edited) are already saved; there is no separate “save before quit” step.

docs/images/create-job.gif

207 KB
Loading

docs/images/interface-overview.gif

272 KB
Loading

docs/images/remote-connect.gif

229 KB
Loading

docs/images/search.gif

196 KB
Loading

docs/index.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,25 @@ Cronboard gives you a keyboard-driven TUI (Terminal User Interface) to:
1414
- Search through jobs using keywords
1515
- See human-readable descriptions of cron expressions in real time
1616

17+
You manage everything from the terminal: no web UI, no extra services. Your crontab stays the standard system crontab, so existing tools and backups keep working.
18+
19+
---
20+
21+
## See it in action
22+
23+
Below is a short overview of Cronboard’s interface. The [Getting Started](getting-started.md) guide walks through each step with more detail and examples.
24+
25+
![Cronboard main window showing the Local tab with a table of cron jobs, expression, command, and status columns](images/interface-overview.gif)
26+
1727
---
1828

1929
## Requirements
2030

2131
- Python **3.13** or later
2232
- `cron` / `crontab` available on the system
2333

34+
Your system must have `cron` installed and the `crontab` command available (e.g. `crontab -l` runs without error). On macOS and most Linux distributions this is already the case.
35+
2436
## Quick Start
2537

2638
```bash

0 commit comments

Comments
 (0)