Skip to content

Commit 15b0a58

Browse files
committed
feat: actual budget + claude-chill
1 parent fc6bf17 commit 15b0a58

File tree

10 files changed

+401
-0
lines changed

10 files changed

+401
-0
lines changed

custom_modules/actual.README.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Actual Budget Setup
2+
3+
Personal finance manager with SimpleFIN bank sync.
4+
5+
## Auth Setup (Required Before First Deploy)
6+
7+
Actual is protected by Caddy basic auth. You must create the auth file before enabling.
8+
9+
### 1. Create directory
10+
```bash
11+
sudo mkdir -p /var/lib/actual
12+
```
13+
14+
### 2. Generate password hash
15+
```bash
16+
caddy hash-password
17+
```
18+
Enter your password when prompted. Copy the output (starts with `$2a$14$...`).
19+
20+
### 3. Create auth file
21+
```bash
22+
sudo tee /var/lib/caddy/actual-auth << 'EOF'
23+
basic_auth {
24+
jrestivo $YOUR_HASH_HERE
25+
}
26+
EOF
27+
```
28+
29+
### 4. Secure the file
30+
```bash
31+
sudo chown caddy:caddy /var/lib/caddy/actual-auth
32+
sudo chmod 640 /var/lib/caddy/actual-auth
33+
```
34+
35+
## Access
36+
37+
- URL: `https://office-desktop.tail5ca7.ts.net:5007/`
38+
- Auth: Caddy basic auth (credentials from above)
39+
- Budget password: Set on first run in Actual UI
40+
41+
Note: Actual Budget doesn't support subpath mounting, so it runs on a separate port.
42+
43+
## SimpleFIN Setup
44+
45+
1. Go to https://beta-bridge.simplefin.org
46+
2. Sign up ($15/year)
47+
3. Link your banks: Chase, Discover, Bilt, Santander, Wells Fargo, Fidelity, Raisin
48+
4. Get your SimpleFIN access token
49+
5. In Actual: Settings → Show advanced settings → Link bank account with SimpleFIN
50+
6. Paste token and link accounts
51+
52+
## Data Location
53+
54+
- Budget files: `/var/lib/actual/user-files/`
55+
- Server data: `/var/lib/actual/server-files/`
56+
- Auth file: `/var/lib/caddy/actual-auth`
57+
58+
## Ports
59+
60+
- Internal: 5006
61+
- External: 5007 (via Caddy with TLS)

custom_modules/actual.nix

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
{
2+
config,
3+
pkgs,
4+
lib,
5+
...
6+
}:
7+
with lib;
8+
let
9+
cfg = config.custom_modules.actual;
10+
port = 5006;
11+
# Generate hash with: caddy hash-password
12+
# Store in /var/lib/caddy/actual-auth containing:
13+
# basic_auth {
14+
# username $2a$14$hashedpassword
15+
# }
16+
authFile = "/var/lib/caddy/actual-auth";
17+
in
18+
{
19+
options.custom_modules.actual.enable = mkOption {
20+
description = "Enable Actual Budget personal finance manager.";
21+
type = with types; bool;
22+
default = false;
23+
};
24+
25+
config = mkIf cfg.enable {
26+
services.actual = {
27+
enable = true;
28+
openFirewall = true;
29+
settings = {
30+
hostname = "0.0.0.0";
31+
port = port;
32+
};
33+
};
34+
35+
# Set base path for subpath deployment
36+
systemd.services.actual.environment.ACTUAL_BASE_PATH = "/actual";
37+
38+
# Caddy reverse proxy at /actual/ subpath
39+
# Using 'handle' (not handle_path) because Actual server handles the /actual prefix itself
40+
services.caddy.virtualHosts."office-desktop.tail5ca7.ts.net".extraConfig = mkAfter ''
41+
42+
handle /actual/* {
43+
# Static assets (anything with a file extension) - no auth needed
44+
# Workers can't send credentials, so bypass auth for all static files
45+
@static path_regexp static \.[a-zA-Z0-9]+$
46+
handle @static {
47+
reverse_proxy 127.0.0.1:${toString port}
48+
}
49+
# Everything else (API endpoints, HTML pages) requires auth
50+
handle {
51+
import ${authFile}
52+
reverse_proxy 127.0.0.1:${toString port}
53+
}
54+
}
55+
redir /actual /actual/ permanent
56+
'';
57+
58+
# Homepage dashboard entry
59+
services.homepage-dashboard.services = mkAfter [
60+
{
61+
"Finance" = [
62+
{
63+
"Actual Budget" = {
64+
icon = "actual-budget";
65+
href = "/actual/";
66+
description = "Personal Finance & Budgeting";
67+
};
68+
}
69+
];
70+
}
71+
];
72+
};
73+
}

custom_modules/workstation_services.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ let
3434
heroic
3535
croc
3636
claude-code
37+
claude-chill
3738
opencode
3839
lmstudio
3940
partclone

flake.lock

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
description = "A highly awesome system configuration.";
33

44
inputs = {
5+
actual-src = {
6+
url = "path:/home/jrestivo/dev/actual";
7+
flake = false;
8+
};
9+
510
hl.url = "github:pamburus/hl";
611
darwin.url = "github:lnl7/nix-darwin/master";
712
darwin.inputs.nixpkgs.follows = "nixpkgs-unpatched";

hosts/desktop.nixos.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
custom_modules.monitoring.enableUps = true;
3939
custom_modules.monitoring.enableGpu = true;
4040
custom_modules.comfyui.enable = true;
41+
custom_modules.actual.enable = true;
4142

4243
# Koito scrobbler - integrates with Navidrome
4344
custom_modules.koito = {

0 commit comments

Comments
 (0)