Skip to content

Commit ae2d682

Browse files
committed
feat: initial commit
0 parents  commit ae2d682

File tree

17 files changed

+1097
-0
lines changed

17 files changed

+1097
-0
lines changed

.dockerignore

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Binaries
2+
bin/
3+
*.exe
4+
*.dll
5+
*.so
6+
*.dylib
7+
8+
# Test binaries
9+
*.test
10+
11+
# Output of the go coverage tool
12+
*.out
13+
14+
# Dependency directories
15+
vendor/
16+
17+
# Go workspace file
18+
go.work
19+
20+
# IDE
21+
.idea/
22+
.vscode/
23+
*.swp
24+
*.swo
25+
*~
26+
27+
# SSH keys
28+
.ssh/
29+
*.pem
30+
*.key
31+
32+
# Environment files
33+
.env
34+
.env.local

.env.example

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Environment variables for Wordle SSH Server
2+
WORDLE_SSH_HOST=0.0.0.0
3+
WORDLE_SSH_PORT=23234
4+
5+
# Path to SSH host key (will be generated if it doesn't exist)
6+
WORDLE_SSH_HOST_KEY_PATH=.ssh/id_ed25519

.github/workflows/build.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
name: Build
2+
3+
on:
4+
push:
5+
branches: [ master ]
6+
pull_request:
7+
branches: [ master ]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
strategy:
13+
matrix:
14+
go-version: [ "1.25" ]
15+
16+
steps:
17+
- uses: actions/checkout@v4
18+
19+
- name: Set up Go
20+
uses: actions/setup-go@v5
21+
with:
22+
go-version: ${{ matrix.go-version }}
23+
24+
- name: Download dependencies
25+
run: go mod download
26+
27+
- name: Verify dependencies
28+
run: go mod verify
29+
30+
- name: Run go vet
31+
run: go vet ./...
32+
33+
- name: Build
34+
run: go build -v ./...

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.idea/
2+
.ssh/
3+
bin/

Dockerfile

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# --- Build ---
2+
FROM golang:1.23-alpine AS builder
3+
4+
WORKDIR /app
5+
6+
COPY go.mod go.sum ./
7+
RUN go mod download
8+
9+
COPY . .
10+
11+
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o wordle-ssh .
12+
13+
# --- Run ---
14+
FROM alpine:latest
15+
16+
RUN apk --no-cache add ca-certificates
17+
18+
WORKDIR /root/
19+
20+
COPY --from=builder /app/wordle-ssh .
21+
22+
RUN mkdir -p .ssh
23+
24+
EXPOSE 23234
25+
26+
ENV WORDLE_SSH_HOST=0.0.0.0
27+
ENV WORDLE_SSH_PORT=23234
28+
ENV WORDLE_SSH_HOST_KEY_PATH=.ssh/id_ed25519
29+
30+
CMD ["./wordle-ssh"]

Makefile

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
APP_NAME := wordle-ssh
2+
CMD_DIR := ./cmd
3+
BIN_DIR := ./bin
4+
5+
# Detect OS
6+
ifeq ($(OS),Windows_NT)
7+
BINARY := $(APP_NAME).exe
8+
MKDIR_CMD := powershell -Command "if (!(Test-Path $(BIN_DIR))) { New-Item -ItemType Directory -Path $(BIN_DIR) | Out-Null }"
9+
RM_CMD := powershell -Command "if (Test-Path $(BIN_DIR)) { Remove-Item -Recurse -Force $(BIN_DIR) }"
10+
RUN_BINARY := $(BIN_DIR)\$(BINARY)
11+
else
12+
BINARY := $(APP_NAME)
13+
MKDIR_CMD := mkdir -p $(BIN_DIR)
14+
RM_CMD := rm -rf $(BIN_DIR)
15+
RUN_BINARY := $(BIN_DIR)/$(BINARY)
16+
endif
17+
18+
.PHONY: all build run clean test fmt vet tidy docker-build docker-run docker-stop docker-clean docker-up docker-down
19+
20+
all: build
21+
22+
build:
23+
@$(MKDIR_CMD)
24+
go build -o $(BIN_DIR)/$(BINARY) $(CMD_DIR)
25+
26+
run: build
27+
$(RUN_BINARY)
28+
29+
clean:
30+
@$(RM_CMD)
31+
32+
tidy:
33+
go mod tidy
34+
35+
fmt:
36+
gofmt -w .
37+
38+
vet:
39+
go vet ./...
40+
41+
test:
42+
go test ./...
43+
44+
docker-build:
45+
docker build -t wordle-ssh:latest .
46+
47+
docker-run:
48+
docker run -d -p 23234:23234 --name wordle-ssh wordle-ssh:latest
49+
50+
docker-stop:
51+
docker stop wordle-ssh || true
52+
docker rm wordle-ssh || true
53+
54+
docker-clean: docker-stop
55+
docker rmi wordle-ssh:latest || true
56+
57+
docker-up:
58+
docker-compose up -d
59+
60+
docker-down:
61+
docker-compose down
62+
63+
docker-logs:
64+
docker-compose logs -f

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# wordle-ssh
2+
3+
A simple Wordle game that you can play over SSH.

cmd/main.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package main
2+
3+
import (
4+
"os"
5+
6+
"github.com/charmbracelet/log"
7+
"github.com/f-gillmann/wordle-ssh/internal/server"
8+
)
9+
10+
func main() {
11+
// Load configuration
12+
config := server.LoadConfigFromEnv()
13+
14+
// Create and start the server
15+
srv, err := server.New(config)
16+
if err != nil {
17+
log.Fatal(err)
18+
os.Exit(1)
19+
}
20+
21+
if err := srv.Start(); err != nil {
22+
log.Fatal(err)
23+
os.Exit(1)
24+
}
25+
}

docker-compose.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
version: '3.8'
2+
3+
services:
4+
wordle-ssh:
5+
build: .
6+
container_name: wordle-ssh-server
7+
ports:
8+
- "23234:23234"
9+
environment:
10+
- WORDLE_SSH_HOST=0.0.0.0
11+
- WORDLE_SSH_PORT=23234
12+
- WORDLE_SSH_HOST_KEY_PATH=.ssh/id_ed25519
13+
volumes:
14+
- ssh-keys:/root/.ssh
15+
restart: unless-stopped
16+
17+
volumes:
18+
ssh-keys:

go.mod

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
module github.com/f-gillmann/wordle-ssh
2+
3+
go 1.25
4+
5+
require (
6+
github.com/charmbracelet/bubbletea v1.3.4
7+
github.com/charmbracelet/lipgloss v1.1.0
8+
github.com/charmbracelet/log v0.4.2
9+
github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309
10+
github.com/charmbracelet/wish v1.4.7
11+
)
12+
13+
require (
14+
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
15+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
16+
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
17+
github.com/charmbracelet/keygen v0.5.3 // indirect
18+
github.com/charmbracelet/x/ansi v0.8.0 // indirect
19+
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
20+
github.com/charmbracelet/x/conpty v0.1.0 // indirect
21+
github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86 // indirect
22+
github.com/charmbracelet/x/input v0.3.4 // indirect
23+
github.com/charmbracelet/x/term v0.2.1 // indirect
24+
github.com/charmbracelet/x/termios v0.1.0 // indirect
25+
github.com/charmbracelet/x/windows v0.2.0 // indirect
26+
github.com/creack/pty v1.1.21 // indirect
27+
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
28+
github.com/go-logfmt/logfmt v0.6.0 // indirect
29+
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
30+
github.com/mattn/go-isatty v0.0.20 // indirect
31+
github.com/mattn/go-localereader v0.0.1 // indirect
32+
github.com/mattn/go-runewidth v0.0.16 // indirect
33+
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
34+
github.com/muesli/cancelreader v0.2.2 // indirect
35+
github.com/muesli/termenv v0.16.0 // indirect
36+
github.com/rivo/uniseg v0.4.7 // indirect
37+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
38+
golang.org/x/crypto v0.37.0 // indirect
39+
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
40+
golang.org/x/sync v0.13.0 // indirect
41+
golang.org/x/sys v0.32.0 // indirect
42+
golang.org/x/text v0.24.0 // indirect
43+
)

0 commit comments

Comments
 (0)