Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
196 commits
Select commit Hold shift + click to select a range
c2cc6b8
Initial commit
rrnewton Oct 22, 2025
79c3699
Copy over some scripts
rrnewton Oct 22, 2025
d69b706
Greatly improve baseline
rrnewton Oct 25, 2025
f8f8c42
minor tweak
rrnewton Oct 25, 2025
d751f73
Improvements
rrnewton Oct 25, 2025
f0f19e6
Remove accidental mtg reference
rrnewton Oct 25, 2025
936c13e
small fixes
rrnewton Oct 25, 2025
33352a6
makefile fix
rrnewton Oct 25, 2025
6550b11
minor
rrnewton Oct 25, 2025
7cbf565
Launch happy from ../
rrnewton Oct 25, 2025
ba2c0d1
minor fix
rrnewton Oct 25, 2025
958daf6
Add a git config
rrnewton Oct 25, 2025
1f13155
Add yarn to dependencies
rrnewton Oct 25, 2025
2ecc3d9
Add shortcut to yank new changes from main to feature branches
rrnewton Oct 25, 2025
14a9549
Merge branch 'main' into happy
rrnewton Oct 25, 2025
2ad69e4
use my version of happy
rrnewton Oct 25, 2025
2c43539
Merge branch 'main' into happy
rrnewton Oct 25, 2025
2f3468d
Add probabalistic prompt selection
rrnewton Oct 25, 2025
efe32dd
gogo python script tweak
rrnewton Oct 25, 2025
4cd0099
Pull in set_git_prompt
rrnewton Oct 26, 2025
9afc7b9
tweak to claude stub
rrnewton Oct 26, 2025
34a03db
remove old script
rrnewton Oct 27, 2025
47e20ba
minor
rrnewton Oct 27, 2025
f5be678
Update to makefile
rrnewton Oct 28, 2025
5807a8f
Consolidate changes lost elsewhere
rrnewton Oct 28, 2025
b52bb7d
critical bugfix
rrnewton Oct 28, 2025
46f1a06
commit_to_main script
rrnewton Oct 28, 2025
c181aaf
commit to main:
rrnewton Oct 28, 2025
6131689
commit to main: add no-edit
rrnewton Oct 28, 2025
6d3f793
commit to main: add CLAUDEWORK directory
rrnewton Oct 28, 2025
0f2cb4d
commit to main: bugfix
rrnewton Oct 28, 2025
1cc7457
commit to main: remove github mcp before attempt add
rrnewton Oct 28, 2025
ab8bde5
gogo script improvement
rrnewton Oct 30, 2025
ad41d25
hmm, ai doc is questionable
rrnewton Oct 30, 2025
fa4ae0f
commit to main:
rrnewton Oct 30, 2025
d0ca57c
commit to main script
rrnewton Oct 30, 2025
7fa83e3
commit to main: minor fix
rrnewton Oct 30, 2025
3670fb2
changes to workspace dir
rrnewton Oct 30, 2025
83cc035
commit to main: gogo script fix
rrnewton Oct 30, 2025
43838ce
Add a Dockerfile.postfix
rrnewton Oct 31, 2025
1b620b8
Factored out Dockerfile.rust
rrnewton Oct 31, 2025
e39a91d
minor
rrnewton Oct 31, 2025
2395e58
allocate slot dynamically
rrnewton Nov 1, 2025
747f6eb
commit to main:
rrnewton Nov 1, 2025
3353672
Add nextest and heaptrack
rrnewton Nov 1, 2025
bc2e50f
commit to main:
rrnewton Nov 1, 2025
f4e205f
commit to main: typo
rrnewton Nov 1, 2025
42bc8d8
commit to main: Lazy git shortcuts
rrnewton Nov 1, 2025
19ab2a7
commit to main: minor
rrnewton Nov 1, 2025
2a0a29e
commit to main: use node 24
rrnewton Nov 1, 2025
fd32399
commit to main: add copilot and upgrade node version
rrnewton Nov 1, 2025
7e02652
commit to main:
rrnewton Nov 2, 2025
b5653ec
commit to main: typo
rrnewton Nov 2, 2025
4cba51e
Add probabalistic prompt selection
rrnewton Oct 25, 2025
217ec9a
gogo python script tweak
rrnewton Oct 25, 2025
a684645
Pull in set_git_prompt
rrnewton Oct 26, 2025
f17496a
tweak to claude stub
rrnewton Oct 26, 2025
a7c64ca
remove old script
rrnewton Oct 27, 2025
b63981e
minor
rrnewton Oct 27, 2025
0212e60
Update to makefile
rrnewton Oct 28, 2025
0b92153
Consolidate changes lost elsewhere
rrnewton Oct 28, 2025
77d9bd5
critical bugfix
rrnewton Oct 28, 2025
94203a4
commit_to_main script
rrnewton Oct 28, 2025
73f7f54
commit to main:
rrnewton Oct 28, 2025
4da2e14
commit to main: add no-edit
rrnewton Oct 28, 2025
c4cf41f
commit to main: add CLAUDEWORK directory
rrnewton Oct 28, 2025
6bd5858
commit to main: bugfix
rrnewton Oct 28, 2025
4e0c18f
commit to main: remove github mcp before attempt add
rrnewton Oct 28, 2025
8471d1a
gogo script improvement
rrnewton Oct 30, 2025
7e5cf63
hmm, ai doc is questionable
rrnewton Oct 30, 2025
4a9c2df
commit to main:
rrnewton Oct 30, 2025
953e52c
commit to main script
rrnewton Oct 30, 2025
b1c7fde
commit to main: minor fix
rrnewton Oct 30, 2025
03a5559
changes to workspace dir
rrnewton Oct 30, 2025
c7a2da0
commit to main: gogo script fix
rrnewton Oct 30, 2025
7843104
Add a Dockerfile.postfix
rrnewton Oct 31, 2025
214de82
Factored out Dockerfile.rust
rrnewton Oct 31, 2025
8261367
minor
rrnewton Oct 31, 2025
c0315f1
allocate slot dynamically
rrnewton Nov 1, 2025
a92280b
commit to main:
rrnewton Nov 1, 2025
e137971
Add nextest and heaptrack
rrnewton Nov 1, 2025
6e50b9f
commit to main:
rrnewton Nov 1, 2025
231f7fa
commit to main: typo
rrnewton Nov 1, 2025
f26eb0d
commit to main: Lazy git shortcuts
rrnewton Nov 1, 2025
070bdda
commit to main: minor
rrnewton Nov 1, 2025
2ce6c31
commit to main: use node 24
rrnewton Nov 1, 2025
579ded5
commit to main: add copilot and upgrade node version
rrnewton Nov 1, 2025
79b16c9
commit to main:
rrnewton Nov 2, 2025
3220840
commit to main: typo
rrnewton Nov 2, 2025
2b2ab09
Add submods
rrnewton Nov 2, 2025
6ae8370
Setting up
rrnewton Nov 2, 2025
c3ff88a
commit to main: disable happy --name hack
rrnewton Nov 2, 2025
de561c4
Merge branch 'main' into happy
rrnewton Nov 2, 2025
e62daa5
ugh
rrnewton Nov 2, 2025
796624c
bump minibeads to v0.5 release
rrnewton Nov 2, 2025
2643d07
claude made a demo
rrnewton Nov 2, 2025
2a328eb
Update docker
rrnewton Nov 2, 2025
50b0be8
commit to main: minor fix
rrnewton Nov 2, 2025
3e004dd
Add headless e2e testing infrastructure with automated authentication
rrnewton Nov 2, 2025
510de52
Add ssh in the base dockerfile.prefix... silly not to have it for git
rrnewton Nov 3, 2025
21e8546
Progress on e2e demo / dev setup
rrnewton Nov 3, 2025
3c44c8b
Add web client authentication with auto-generated secret key
rrnewton Nov 3, 2025
3999c09
Fix secret key format for web client authentication
rrnewton Nov 3, 2025
365d015
Add troubleshooting for web client authentication issues
rrnewton Nov 3, 2025
c2a27a5
Update docs for auto-detection of localhost server
rrnewton Nov 3, 2025
c7c9572
Add build_and_run_container.sh convenience script
rrnewton Nov 3, 2025
67d3fa8
Document build_and_run_container.sh in README
rrnewton Nov 3, 2025
960b31f
Add diagnostic and configuration tools for web client
rrnewton Nov 3, 2025
ae8107a
Convenience script and the agent fights with auth flows
rrnewton Nov 3, 2025
ff0ee71
Add debug guide for web client authentication issues
rrnewton Nov 3, 2025
ed35d67
Clear web client cache in e2e-web-demo and add debug instructions
rrnewton Nov 3, 2025
5133a73
Fix encryption key derivation in setup-test-credentials script
rrnewton Nov 3, 2025
577e756
Update minibeads and symlink to bd a
rrnewton Nov 6, 2025
849c22d
Merge
rrnewton Nov 7, 2025
e1aee53
commit to main: alias for laziness
rrnewton Nov 2, 2025
2531e51
commit to main:
rrnewton Nov 23, 2025
da2ece4
bump minibeads
rrnewton Nov 23, 2025
7e56e04
Automate PostgreSQL setup for e2e testing
rrnewton Nov 23, 2025
cbc6745
Minor: remove unneeded rust stuff
rrnewton Nov 23, 2025
2a66bd9
Fix credential mismatch in e2e-web-demo.sh
rrnewton Nov 23, 2025
be4a23d
Add Makefile and scripts for managing submodule branches
rrnewton Nov 23, 2025
ae9934e
Start feature: cli-prompts
rrnewton Nov 23, 2025
680ee04
Add comprehensive self-hosted setup guide
rrnewton Nov 23, 2025
af44060
Add Playwright browser automation and build targets
rrnewton Nov 26, 2025
cad850e
Refactor Makefile: rename demo to server, standardize on ~/.happy
rrnewton Nov 26, 2025
96711cb
Standardize all scripts to use ~/.happy for normal workflows
rrnewton Nov 26, 2025
8529405
Update mb version and add to path
rrnewton Nov 26, 2025
a179af7
Merge branch 'main' into happy-cli-prompts
rrnewton Nov 26, 2025
f59bf64
referenc e beads in CLAUDE.md
rrnewton Nov 26, 2025
33a72a8
minor
rrnewton Nov 27, 2025
79d5511
Use rrnewton as base development branch for submodules
rrnewton Nov 27, 2025
689fe38
End feature: cli-prompts (merge to happy branch)
rrnewton Nov 27, 2025
3b32377
Add make validate target for running all tests
rrnewton Nov 27, 2025
7083e23
Refactor validate script to use happy-demo.sh for service management
rrnewton Nov 27, 2025
c7d02ae
update CLAUDE.md
rrnewton Nov 27, 2025
f1e5af4
Add GitHub Actions CI workflow
rrnewton Nov 27, 2025
eff2aba
Fix CI workflow to work with GHA service containers
rrnewton Nov 27, 2025
df60bee
Add Prisma migration step to CI workflow
rrnewton Nov 27, 2025
186583a
Fix happy-server startup: Add Redis URL configuration
rrnewton Nov 27, 2025
8754891
Add server log output on E2E startup failure
rrnewton Nov 27, 2025
aa85223
Fix happy-server startup: Pass all S3/MinIO env vars
rrnewton Nov 27, 2025
2cd16a2
Fix happy-server startup: Add HANDY_MASTER_SECRET env var
rrnewton Nov 27, 2025
07db0b2
Add step to install browser test dependencies
rrnewton Nov 27, 2025
5c8c756
leftover gitconfig change from agent
rrnewton Nov 27, 2025
5e14c5e
Add make push target and fix webapp status detection
rrnewton Nov 29, 2025
d9f8859
Add dump.rdb to gitignore
rrnewton Nov 29, 2025
15add7f
Add E2E test infrastructure and update happy-cli submodule
rrnewton Nov 29, 2025
80b4415
Add slot-based service launcher for parallel testing
rrnewton Nov 29, 2025
00e3548
change for vscode
rrnewton Nov 29, 2025
7612fec
Rename happy-demo.sh to happy-launcher.sh with slot support
rrnewton Nov 29, 2025
7c16d3a
Add slot isolation for e2e tests and METRICS_PORT support
rrnewton Nov 29, 2025
5fbefcc
Fix validate.sh to use happy-launcher.sh with slot isolation
rrnewton Nov 29, 2025
7dd7efd
Fix validate.sh env var conflict with launcher --slot check
rrnewton Nov 29, 2025
3af8309
Fix postgres setup: ensure password and database exist
rrnewton Nov 30, 2025
2dbf7a7
Improve cleanup: add --all-slots and --nuke-happy-dir options
rrnewton Nov 30, 2025
845c759
Add --vitest and --e2e-only modes to validate.sh
rrnewton Nov 30, 2025
62278fe
Add vitest-based E2E test framework
rrnewton Nov 30, 2025
e1487f9
Add E2E testing architecture documentation
rrnewton Nov 30, 2025
01d08e9
Add package.json to .gitignore
rrnewton Nov 30, 2025
b81094b
Fix create-account test: filter expected port 3005 errors
rrnewton Nov 30, 2025
2a80fec
Argh, remove vs code inserted stuff for now
rrnewton Nov 30, 2025
8515193
Fix runtime server port for E2E tests
rrnewton Nov 30, 2025
2a436da
Consolidate validate.sh to use vitest-only E2E tests
rrnewton Nov 30, 2025
3e98c4a
Wait for webapp bundle to compile, not just port open
rrnewton Nov 30, 2025
be4bca8
Wait for actual bundle compilation, not just HTML shell
rrnewton Nov 30, 2025
7f72467
Fix NODE_ENV=test causing expo-router build failure
rrnewton Nov 30, 2025
8075aa3
Add E2E testing infrastructure epic (hp-1)
rrnewton Nov 30, 2025
3efbdbe
Fix status output to properly show slot-specific services
rrnewton Nov 30, 2025
af70088
Add database isolation per slot for test safety
rrnewton Nov 30, 2025
42ab6ca
coding style in CLAUDE.md
rrnewton Nov 30, 2025
c8b28c0
Add --all-slots support for status command
rrnewton Nov 30, 2025
879d6ac
Rename start-all to start, add start-backend
rrnewton Nov 30, 2025
4e0061b
Improve make status to show full git status for all 4 repos
rrnewton Nov 30, 2025
3be7b75
avoid silent failures
rrnewton Nov 30, 2025
565dabf
Minor reorg
rrnewton Nov 30, 2025
55c7c34
submod + minor changes
rrnewton Nov 30, 2025
e5ef974
Add auth redirect E2E tests and update happy submodule
rrnewton Nov 30, 2025
66427b2
Add E2E test for error banners and fix type error
rrnewton Nov 30, 2025
f5fa857
Switch of dynamic happy server as it isn't working
rrnewton Nov 30, 2025
2254b10
Fix error-banners E2E test reliability
rrnewton Nov 30, 2025
8462df2
Skip error-banners E2E test until reliable disconnection testing is p…
rrnewton Nov 30, 2025
a28f9aa
Makefile changes for running separate containers
rrnewton Dec 1, 2025
083b3fb
Add voice agent setup scripts and update submodules for private voice…
rrnewton Dec 1, 2025
e97db83
File tasks for open TODOs and update submod
rrnewton Dec 1, 2025
944ff07
Remove voice_agent scripts, update happy submodule
rrnewton Dec 1, 2025
8a3dd88
Replace happy-demo.sh with happy-launcher.sh everywhere
rrnewton Dec 2, 2025
f0a52d1
Clean up documentation: minimal README + QUICKSTART + CONTRIBUTING
rrnewton Dec 2, 2025
c365c21
Fix make web to use happy-launcher.sh start-webapp
rrnewton Dec 2, 2025
7bfcdcb
Add --debug flag to happy-launcher.sh for AI auto debugging
rrnewton Dec 2, 2025
4cd381e
Minor - cleanup stray files, submod, plus a hack in the makefile
rrnewton Dec 2, 2025
0d34d0c
Build dependencies
rrnewton Dec 2, 2025
b57f5cb
Changes to makefile and launcher for convenient self hosting
rrnewton Dec 3, 2025
cf8a254
Add document tracking status of fork changes and their merges upstream
rrnewton Dec 3, 2025
f475a79
remove submodules
Jan 27, 2026
8652783
Merge remote-tracking branch 'devbox-origin/happy' into feat-merge-ha…
GrocerPublishAgent Jan 27, 2026
52c2bb6
fixup! Merge remote-tracking branch 'devbox-origin/happy' into feat-m…
GrocerPublishAgent Jan 27, 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
5 changes: 5 additions & 0 deletions .devcontainer/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Dockerfile
home/
*~
.session_title.txt
slot.txt
94 changes: 94 additions & 0 deletions .devcontainer/CLAUDE.md.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@


Coding conventions
========================================

PREFER STRONG TYPES. For example, in Rust do not use "u32" or "String" where you can have a more specific type or at least a type alias. "String" makes it very unclear which values are legal. We want explicit Enums to lock down the possibilities for our state, and we want separate types for numerical IDs and distinct, non-overlapping uses of basic integers.

Delete trailing spaces. Don't leave empty lines that consist only of whitespace. (Double newline is fine.)

Add README.md files for every major subdirectory/subsystem. For example `src/system1/`, `src/system2/`, etc.

Read the PROJECT_VISION, if this is a high-performance project, e.g. in Rust, we should follow for high-performance Rust (unboxing, minimizing allocation, etc). In particular, adhere to the below programming patterns / avoid anti-patterns, which generally fall under the principle of "zero copy":

- Avoid clone: instead take a temporary reference to the object and manage lifetimes appropriately.
- Avoid collect: instead take an iterator with references to the original collection without copying.

Read OPTIMIZATION.md for more details.

Workflow: Tasks and Commits
========================================

Commit to git with each unit of work.

Task Tracking
----------------------------------------

We use "beads" to track our issues locally under version control. Review `bd quickstart` to learn how to use it.

Every time we do a git commit, update our beads issues to reflect:
- What was just completed (check off items in lists, close completed task(s))
- What's next (update the in tracking issues that track the granular issues)
- Mention in the commit any new issues created to document bugs found or future work.

The beads database is our primary tracking mechanism, so if we lose conversation history we can start again from there. You should periodically do documentation work, usually before committing, to make sure information in the issues is up-to-date.

### Beads CONVENTIONS for this project

Do NOT read or modify files inside the `./.beads/` private database, except when fixing merge conflicts in markdown files that you can read.

Prefer the MCP client to the CLI tool. ALWAYS `bd update` existing issues, never introduce duplicates with spurious `bd create`.

The issue prefix may be customized (`foobar-1`, `foobar-2`), but here we will refer `bd-1` as example issue names

#### Tracking issues and Priorities

- Issues labeled "human" are created by me and will always have 0 priority.
- Issue bd-1, at priority 0, is the OVERALL tracking issue. It primarily references other tracking issues
and reiterate some of these conventions. We want to keep it pretty short.

- The next tracking issues, e.g. bd-2 and on have priority 1 and are topic-specific trackers:
- Optimization tracking
- Feature completeness
- Cross-cutting codebase issues (refactorings, change of dependencies/conventions, etc)
- All tracking issues refer to granular issues by name in their text, e.g. "bd-42"
- All other granular issues will have priority 3 to 4 unless they are seen as a critical bug, which will bump them to priority 2.

#### Mark transient information

We often record transient information, like benchmark results, that quickly gets out of date. We want to label such information so we can tell how old it is. In addition to YYYY-MM-DD, our convention is to use:
`git rev-list --count HEAD`
which prints out the number of commits in the repo (or equivalently the ./gitdepth.sh script), and then format the timestamp as `YYYY-MM-DD_#DEPTH(387498cecf)` e.g. `2025-10-22_#161(387498cecf)`. That's our full timestamp
for any transient information that derives from a specific commit.
Sometimes this requires us to split our commits into (1) functionality and then (2) documentation-update.

#### Reference issues in code TODO

We don't want TODO items to be in floating code alone. For anything but the most trivial TODOs, we adopt the convention of referencing issues that tracks the TODO:

```
// TODO(bd-13): brief summary here
```

Then, the commit that fixes the issue both removes the comment and closes the issue in beads.

#### Use description field only, not notes

When creating or updating issues with `bd`, always put ALL content in the description field. Do NOT use the --notes field, as it creates duplication and confusion between what's in description vs notes. Keep information consolidated in the description field only, but you may use labels for classification.

Clean Start: Before beginning work on a task
--------------------------------------------

Make sure we start in a clean state. Check that we have no uncommitted changes in our working copy. Perform `git pull origin main` to make sure we are starting with the latest version. Check that `make validate` passes in our starting state.

If github MCP is configured and github actions workflows exist for this project, check the github actions CI status for the most recent commit and make sure it not red (if it's still pending, ignore and proceed). If
there's a CI failure, then fixing THAT becomes our task. Finally, check that `make validate` passes locally in our starting state.

Pre-Commit: checks before committing to git
--------------------------------------------

Run `make validate` and ensure that it passes or fix any problems before committing.

Also include a `Test Results Summary` section in every commit message that summarizes how many tests passed of what kind.

If you validate some changes with a new manual or temporary test, that test should be added to either the unit tests, examples, or e2e tests and it should be called consistently from both `make validate` and Github CI.
21 changes: 21 additions & 0 deletions .devcontainer/Dockerfile.claude
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@


ARG CLAUDE_CODE_VERSION=latest

ARG GIT_DELTA_VERSION=0.18.2
RUN ARCH=$(dpkg --print-architecture) && \
wget "https://github.com/dandavison/delta/releases/download/${GIT_DELTA_VERSION}/git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb" && \
sudo dpkg -i "git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb" && \
rm "git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb"

# Install Claude
RUN npm install -g @anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}

# Copy and set up firewall script
COPY init-firewall.sh /usr/local/bin/
USER root
RUN chmod +x /usr/local/bin/init-firewall.sh && \
echo "node ALL=(root) NOPASSWD: /usr/local/bin/init-firewall.sh" > /etc/sudoers.d/node-firewall && \
chmod 0440 /etc/sudoers.d/node-firewall
ENV IS_SANDBOX=1
# End claude-related dependencies and setup.
2 changes: 2 additions & 0 deletions .devcontainer/Dockerfile.copilot
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
RUN npm install -g @github/copilot

2 changes: 2 additions & 0 deletions .devcontainer/Dockerfile.gemini
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

RUN npm install -g @google/gemini-cli
8 changes: 8 additions & 0 deletions .devcontainer/Dockerfile.postfix
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Set the working directory to the custom WORKDIR
# Create /workspace as a symlink to WORKDIR (for backward compatibility)
# Only create symlink if WORKDIR is not /workspace
ARG WORKDIR=/workspace
RUN if [ "$WORKDIR" != "/workspace" ]; then \
ln -s ${WORKDIR} /workspace; \
fi
WORKDIR ${WORKDIR}
126 changes: 126 additions & 0 deletions .devcontainer/Dockerfile.prefix
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@

# [RRN] node image has too old versions for certain packages we use:
# FROM node:25
FROM ubuntu:25.10

# [RRN] TZ confuses happy-coder
# ARG TZ
# ENV TZ="$TZ"

# Stolen from the nodejs/docker/node Dockerfile:
# RUN groupadd --gid 1000 node \
# && useradd --uid 1000 --gid node --shell /bin/bash --create-home node

# Install basic development tools and iptables/ipset
RUN apt-get update && apt-get install -y --no-install-recommends \
less \
git \
procps \
sudo \
fzf \
zsh \
man-db \
unzip \
gnupg2 \
gh \
iptables \
ipset \
iproute2 \
dnsutils \
aggregate \
jq \
nano \
vim \
wget \
curl
# [RRN ] Don't clean because we want to keep apt and I don't mind if claude
# installs either:
# && apt-get clean && rm -rf /var/lib/apt/lists/*

# Installs a TON of stufF:
# RUN apt-get install -y npm

# Going to a newer version for github copilot
RUN apt-get install -y ca-certificates && \
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

ARG NODE_VERSION=24

RUN . "$HOME/.nvm/nvm.sh" && nvm install ${NODE_VERSION} && \
nvm alias default ${NODE_VERSION} && nvm use default && \
which node && node -v && npm -v

# Hack to discover the minor version: e.g. /bin/versions/node/v24.11.0/bin/node
RUN cd /bin/versions/node/ && ln -s v24* 24
ENV PATH=$PATH:/bin/versions/node/24/bin/

# Install global packages
# ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global
# ENV PATH=$PATH:/usr/local/share/npm-global/bin

# [RRN] Differ in the non-root user we use from the node image:
# ENV MYUSER=node
ENV MYUSER=ubuntu

# Ensure default node user has access to /usr/local/share
RUN mkdir -p /usr/local/share/npm-global && \
chown -R $MYUSER:$MYUSER /usr/local/share

ARG USERNAME=$MYUSER

# [RRN] Seems unimportant. We mount home dir from host anyway.
# Persist bash history.
# RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \
# && mkdir /commandhistory \
# && touch /commandhistory/.bash_history \
# && chown -R $USERNAME /commandhistory

# Set `DEVCONTAINER` environment variable to help with orientation
ENV DEVCONTAINER=true

# [RRN] Uh, I don't know why claude needs to be opinionated about shell..
# Set the default shell to zsh rather than sh
# ENV SHELL=/bin/zsh

# Set the default editor and visual
ENV EDITOR=nano
ENV VISUAL=nano

# Default powerline10k theme
# ARG ZSH_IN_DOCKER_VERSION=1.2.0
# RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v${ZSH_IN_DOCKER_VERSION}/zsh-in-docker.sh)" -- \
# -p git \
# -p fzf \
# -a "source /usr/share/doc/fzf/examples/key-bindings.zsh" \
# -a "source /usr/share/doc/fzf/examples/completion.zsh" \
# -a "export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \
# -x


# [RRN] basic additiions I like everywhere.
# psmisc has killall:
RUN apt-get install -y time parallel hyperfine bc emacs gnuplot psmisc ssh

# [RRN] Python is so universal for scripting...
RUN apt-get install -y python3 pip python3-venv
RUN python3 -m venv /opt/venv
RUN /opt/venv/bin/python3 -m pip install uv
# End shared, non-project configuration.

# [RRN] Run my version, but cannot do it in a one-liner because of build step:
RUN . "$HOME/.nvm/nvm.sh" && \
npm install -g happy-coder
# Shelving my version for now which just added --set-title.
# git clone --depth=1 https://github.com/rrnewton/happy-cli.git /tmp/happy && \
# cd /tmp/happy && npm install && npm run build && npm install -g . && \
# rm -rf /tmp/happy


# Create workspace and config directories and set permissions
#RUN mkdir -p /workspace /home/$MYUSER/.claude && \
# chown -R $MYUSER:$MYUSER /workspace /home/$MYUSER/.claude

# WORKDIR /workspace

# USER $MYUSER
ENV SHELL=/bin/bash
43 changes: 43 additions & 0 deletions .devcontainer/Dockerfile.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
USER root

# Install yarn
RUN npm install -g yarn

# Install system dependencies for happy-server
RUN apt-get update && apt-get install -y \
postgresql \
postgresql-contrib \
redis-server \
lsof \
nmap \
wget
# && rm -rf /var/lib/apt/lists/*

# Install MinIO server
RUN wget -q https://dl.min.io/server/minio/release/linux-amd64/minio \
&& chmod +x minio \
&& mv minio /usr/local/bin/

# Install MinIO client (mc)
RUN wget -q https://dl.min.io/client/mc/release/linux-amd64/mc \
&& chmod +x mc \
&& mv mc /usr/local/bin/

# Install Playwright for browser automation testing
RUN npm install -g playwright \
&& npx playwright install chromium \
&& npx playwright install-deps chromium

# Expose ports for Happy services
# happy-server API
EXPOSE 3005
# happy web client (Expo)
EXPOSE 8081
# MinIO API
EXPOSE 9000
# MinIO Console
EXPOSE 9001
# PostgreSQL
EXPOSE 5432
# Redis
EXPOSE 6379
14 changes: 14 additions & 0 deletions .devcontainer/Dockerfile.rust
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

# Keep it out of the home dir because we will mount that from host:
RUN apt-get install rustup
ENV CARGO_HOME=/opt/cargo
ENV RUSTUP_HOME=/opt/multirust
RUN mkdir -p "$CARGO_HOME" && rustup toolchain install nightly
# RUN mkdir -p "$CARGO_HOME" && rustup toolchain install stable

# Install my minibeads tool for issue tracking
RUN cargo install --git https://github.com/rrnewton/minibeads --tag v0.15 && \
ln -s /opt/cargo/bin/mb /opt/cargo/bin/bd

# RUN apt-get install -y heaptrack
# RUN cargo install cargo-heaptrack cargo-nextest
Loading
Loading