Skip to content

Commit 0ce1ecd

Browse files
authored
Remove gRPC implementation (#237)
1 parent 8a0c6df commit 0ce1ecd

30 files changed

+16
-10856
lines changed

.agents/architecture.md

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,32 @@
11
# Task Wizard — Architecture Summary
22

3-
Task Wizard is a self-hosted, privacy-focused task management application. It is composed of three main services and a shared protobuf contract layer.
3+
Task Wizard is a self-hosted, privacy-focused task management application. It is composed of three main services.
44

55
## System Components
66

77
### 1. API Server (`apiserver/`)
88
- **Language**: Go
9-
- **Framework**: Gin (HTTP), gRPC, WebSocket
9+
- **Framework**: Gin (HTTP), WebSocket
1010
- **DI**: Uber FX
1111
- **Database**: SQLite (default) or MySQL via GORM
1212
- **Role**: The central backend. Handles all business logic, persistence, authentication, background scheduling, notifications, and serves the frontend as static files.
1313

1414
### 2. Frontend (`frontend/`)
1515
- **Language**: TypeScript
1616
- **Framework**: React (class components) with Redux
17-
- **Transport**: gRPC-Web as primary, HTTP REST as fallback
17+
- **Transport**: HTTP REST
1818
- **Role**: Single-page application for task management, label organization, notification configuration, API token management, and user settings.
1919

2020
### 3. MCP Server (`mcpserver/`)
2121
- **Language**: C# (.NET 9)
2222
- **Framework**: ASP.NET Core with ModelContextProtocol
2323
- **Role**: Exposes task and label management as MCP (Model Context Protocol) tools so AI assistants can interact with Task Wizard programmatically. Currently uses in-memory stub data.
2424

25-
### 4. Protobuf Contracts (`proto/`)
26-
- **Language**: Protocol Buffers v3
27-
- **Role**: Single source of truth for all message types, enumerations, and service definitions shared between the API server (Go) and the frontend (TypeScript). Code generation scripts produce Go and TypeScript stubs.
2825

2926
## Communication
3027

3128
```
32-
┌───────────┐ gRPC-Web / HTTP ┌──────────────┐
29+
┌───────────┐ HTTP REST ┌──────────────┐
3330
│ Frontend │ ──────────────────► │ API Server │
3431
│ (React) │ ◄──── WebSocket ── │ (Go / Gin) │
3532
└───────────┘ └──────┬───────┘
@@ -52,7 +49,6 @@ Task Wizard is a self-hosted, privacy-focused task management application. It is
5249
| Layer | Directory | Purpose |
5350
|-------|-----------|---------|
5451
| HTTP Handlers | `internal/apis/` | REST + CalDAV route handlers |
55-
| gRPC Services | `internal/grpc/` | Generated gRPC service implementations |
5652
| Middleware | `internal/middleware/` | JWT auth, scope enforcement |
5753
| Models | `internal/models/` | GORM data models |
5854
| Repositories | `internal/repos/` | Database access layer |
@@ -68,8 +64,7 @@ Task Wizard is a self-hosted, privacy-focused task management application. It is
6864
|-------|-----------|---------|
6965
| Views | `src/views/` | Page-level React components (Tasks, Labels, Settings, Auth, etc.) |
7066
| Store | `src/store/` | Redux slices for tasks, labels, user, tokens, feature flags, WebSocket, status |
71-
| API | `src/api/` | HTTP/gRPC transport abstraction |
72-
| gRPC | `src/grpc/` | Generated gRPC-Web client and type definitions |
67+
| API | `src/api/` | HTTP transport abstraction |
7368
| Models | `src/models/` | TypeScript interfaces and helpers |
7469
| Components | `src/components/` | Shared UI components (ErrorBoundary, StatusList) |
7570

@@ -80,6 +75,6 @@ Task Wizard is a self-hosted, privacy-focused task management application. It is
8075
- **Dependency injection** (Uber FX) for wiring
8176
- **Scope-based authorization** on API tokens (e.g. `task:read`, `label:write`, `dav:read`)
8277
- **Background scheduler** for notifications, token cleanup, password reset expiration
83-
- **Smart transport** in the frontend — tries WebSocket/gRPC first, falls back to HTTP
78+
- **Smart transport** in the frontend — uses WebSocket for real-time updates, HTTP for requests
8479
- **Feature flags** to toggle behaviors like WebSocket transport and auto-refresh
8580
- **Real-time sync** via WebSocket with per-user connection tracking

.github/copilot-instructions.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ For detailed architecture, data flow, and feature documentation, see the `.agent
66

77
## Project Overview
88

9-
Task Wizard is a self-hosted, privacy-focused task management app: React frontend communicates via gRPC-Web/HTTP → Go API server handles business logic and persistence → SQLite/MySQL via GORM. A .NET MCP server exposes tools for AI assistants.
9+
Task Wizard is a self-hosted, privacy-focused task management app: React frontend communicates via HTTP → Go API server handles business logic and persistence → SQLite/MySQL via GORM. A .NET MCP server exposes tools for AI assistants.
1010

11-
**Components:** API Server (`apiserver/`), Frontend (`frontend/`), MCP Server (`mcpserver/`), Proto (`proto/`)
11+
**Components:** API Server (`apiserver/`), Frontend (`frontend/`), MCP Server (`mcpserver/`)
1212

1313
## Development Commands
1414

@@ -28,9 +28,6 @@ cd frontend && yarn test:e2e # E2E tests (Playwright)
2828
2929
# MCP Server
3030
cd mcpserver && dotnet build # Build
31-
32-
# Proto generation (after modifying .proto files)
33-
cd proto && .\generate.ps1
3431
```
3532

3633
## Code Style
@@ -72,7 +69,6 @@ cd proto && .\generate.ps1
7269
## Workflow Rules
7370

7471
- **Always build and test before completing work**: run `go build ./... && go test ./...` for backend, `yarn lint && yarn tsc && yarn build` for frontend, `dotnet build` for MCP server
75-
- After proto changes, run `cd proto && .\generate.ps1` and verify all builds still pass
7672

7773
## CI/CD
7874

apiserver/go.mod

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ require (
1313
go.uber.org/fx v1.22.0
1414
go.uber.org/zap v1.26.0
1515
golang.org/x/crypto v0.45.0
16-
google.golang.org/grpc v1.76.0
1716
gorm.io/gorm v1.30.0
1817
)
1918

@@ -28,7 +27,8 @@ require (
2827
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
2928
github.com/go-sql-driver/mysql v1.8.1 // indirect
3029
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
31-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect
30+
golang.org/x/net v0.47.0 // indirect
31+
google.golang.org/protobuf v1.34.1 // indirect
3232
)
3333

3434
require (
@@ -77,10 +77,8 @@ require (
7777
go.uber.org/multierr v1.10.0 // indirect
7878
golang.org/x/arch v0.8.0 // indirect
7979
golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 // indirect
80-
golang.org/x/net v0.47.0
8180
golang.org/x/sys v0.38.0 // indirect
8281
golang.org/x/text v0.31.0 // indirect
83-
google.golang.org/protobuf v1.36.10
8482
gopkg.in/ini.v1 v1.67.0 // indirect
8583
gopkg.in/yaml.v3 v3.0.1 // indirect
8684
modernc.org/libc v1.55.3 // indirect

apiserver/go.sum

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9g
3434
github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k=
3535
github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw=
3636
github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ=
37-
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
38-
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
39-
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
40-
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
4137
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
4238
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
4339
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
@@ -52,10 +48,8 @@ github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
5248
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
5349
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
5450
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
55-
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
56-
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
57-
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
58-
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
51+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
52+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
5953
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
6054
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
6155
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
@@ -148,18 +142,6 @@ github.com/ulule/limiter/v3 v3.11.2 h1:P4yOrxoEMJbOTfRJR2OzjL90oflzYPPmWg+dvwN2t
148142
github.com/ulule/limiter/v3 v3.11.2/go.mod h1:QG5GnFOCV+k7lrL5Y8kgEeeflPH3+Cviqlqa8SVSQxI=
149143
github.com/wneessen/go-mail v0.7.1 h1:rvy63sp14N06/kdGqCYwW8Na5gDCXjTQM1E7So4PuKk=
150144
github.com/wneessen/go-mail v0.7.1/go.mod h1:+TkW6QP3EVkgTEqHtVmnAE/1MRhmzb8Y9/W3pweuS+k=
151-
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
152-
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
153-
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
154-
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
155-
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
156-
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
157-
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
158-
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
159-
go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
160-
go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
161-
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
162-
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
163145
go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc=
164146
go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
165147
go.uber.org/fx v1.22.0 h1:pApUK7yL0OUHMd8vkunWSlLxZVFFk70jR2nKde8X2NM=
@@ -191,14 +173,8 @@ golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
191173
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
192174
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
193175
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
194-
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
195-
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
196-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8=
197-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
198-
google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
199-
google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
200-
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
201-
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
176+
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
177+
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
202178
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
203179
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
204180
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

0 commit comments

Comments
 (0)