<feed xmlns='http://www.w3.org/2005/Atom'>
<title>muxstr.git/internal/handler/grpc, branch main</title>
<subtitle>Nostr relay with gRPC, HTTP/JSON, and WebSocket interfaces</subtitle>
<id>https://code.northwest.io/muxstr.git/atom?h=main</id>
<link rel='self' href='https://code.northwest.io/muxstr.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/'/>
<updated>2026-02-16T20:04:20+00:00</updated>
<entry>
<title>refactor: migrate nostr dependency to code.northwest.io</title>
<updated>2026-02-16T20:04:20+00:00</updated>
<author>
<name>bndw</name>
<email>ben@bdw.to</email>
</author>
<published>2026-02-16T20:04:20+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/commit/?id=02d6819ebfdc5b18d65c83c4077a040466960bac'/>
<id>urn:sha1:02d6819ebfdc5b18d65c83c4077a040466960bac</id>
<content type='text'>
Updated all import references from northwest.io/nostr to code.northwest.io/nostr and removed the local replace directive from go.mod. The module is now resolved from the published repository.
</content>
</entry>
<entry>
<title>refactor: remove frivolous comments from auth validation/credentials</title>
<updated>2026-02-14T20:03:21+00:00</updated>
<author>
<name>bndw</name>
<email>ben@bdw.to</email>
</author>
<published>2026-02-14T20:03:21+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/commit/?id=4fc493e6d8cc20137f920f8647e39fc5051bb245'/>
<id>urn:sha1:4fc493e6d8cc20137f920f8647e39fc5051bb245</id>
<content type='text'>
Also removed internal/nostr package - now using northwest.io/nostr library.
</content>
</entry>
<entry>
<title>refactor: rename project from nostr-grpc to muxstr</title>
<updated>2026-02-14T16:21:01+00:00</updated>
<author>
<name>bndw</name>
<email>ben@bdw.to</email>
</author>
<published>2026-02-14T16:21:01+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/commit/?id=0406e24e1259e1a9adcd739da388dcca9ec8feba'/>
<id>urn:sha1:0406e24e1259e1a9adcd739da388dcca9ec8feba</id>
<content type='text'>
Update module path from northwest.io/nostr-grpc to northwest.io/muxstr.
This includes updating all Go imports, protobuf definitions, generated
files, and documentation.
</content>
</entry>
<entry>
<title>feat: implement NIP-09 with hard delete</title>
<updated>2026-02-14T04:38:59+00:00</updated>
<author>
<name>bndw</name>
<email>ben@bdw.to</email>
</author>
<published>2026-02-14T04:38:59+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/commit/?id=dfa19ff0776be0850ad7b86ca579601431349593'/>
<id>urn:sha1:dfa19ff0776be0850ad7b86ca579601431349593</id>
<content type='text'>
Implement event deletion (NIP-09) using hard delete approach:
- Kind 5 events trigger deletion but are not stored themselves
- ProcessDeletion hard deletes referenced events (DELETE FROM events)
- Only authors can delete their own events (pubkey verification)
- Support multiple event IDs in single deletion request
- No deletions table needed (simpler schema)
- Added 4 deletion tests covering various scenarios
- All 45 tests passing
</content>
</entry>
<entry>
<title>refactor: simplify deletion handling (remove NIP-09 processing)</title>
<updated>2026-02-14T04:36:12+00:00</updated>
<author>
<name>bndw</name>
<email>ben@bdw.to</email>
</author>
<published>2026-02-14T04:36:12+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/commit/?id=89b8948195f24df127b7ae656ab3f60bd1b49ac7'/>
<id>urn:sha1:89b8948195f24df127b7ae656ab3f60bd1b49ac7</id>
<content type='text'>
Remove deletion processing logic in favor of simpler approach:
- Remove deletions table from schema
- Delete deletions.go and deletions_test.go
- Remove ProcessDeletion from EventStore interface
- Kind 5 events now stored like any other event (no special handling)
- Update storage test to expect 2 tables instead of 3
- All 41 tests passing
</content>
</entry>
<entry>
<title>feat: implement NIP-09 (deletions) and NIP-11 (relay info)</title>
<updated>2026-02-14T03:12:28+00:00</updated>
<author>
<name>bndw</name>
<email>ben@bdw.to</email>
</author>
<published>2026-02-14T03:12:28+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/commit/?id=656748ea286ff7eac6cbe1b241ad31212892ba61'/>
<id>urn:sha1:656748ea286ff7eac6cbe1b241ad31212892ba61</id>
<content type='text'>
NIP-11 (Relay Information Document):
- Serves relay metadata at GET / with Accept: application/nostr+json
- Returns name, description, supported NIPs, limitations
- CORS headers for browser compatibility

NIP-09 (Event Deletion):
- Kind 5 events delete events referenced in 'e' tags
- Only authors can delete their own events
- Soft delete (marks deleted=1)
- Records deletion in deletions table
- Works across all protocols (gRPC, Connect, WebSocket)

Fixed deletions schema:
- deleted_event_id as PRIMARY KEY (not deletion_event_id)
- Allows one deletion event to delete multiple events

3 new tests, 44 total tests passing

Supported NIPs now: 1, 9, 11
</content>
</entry>
<entry>
<title>feat: add WebSocket server with full NIP-01 support</title>
<updated>2026-02-14T02:17:37+00:00</updated>
<author>
<name>bndw</name>
<email>ben@bdw.to</email>
</author>
<published>2026-02-14T02:17:37+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/commit/?id=3481c3273f8764bd0a0ab51183dc57f592fb616c'/>
<id>urn:sha1:3481c3273f8764bd0a0ab51183dc57f592fb616c</id>
<content type='text'>
WebSocket handler:
- NIP-01 protocol (EVENT, REQ, CLOSE, OK, EOSE, NOTICE)
- JSON envelope parsing
- Shares subscription manager with gRPC (unified event fan-out)
- Standard Nostr client compatibility

Relay now serves dual protocols:
- gRPC on :50051 (binary, high performance)
- WebSocket on :8080 (JSON, Nostr standard)

Both protocols share:
- Same storage layer
- Same subscription manager
- Same validation logic

Compatible with all Nostr clients!
</content>
</entry>
<entry>
<title>feat: implement Subscribe with real-time event streaming</title>
<updated>2026-02-14T01:58:29+00:00</updated>
<author>
<name>bndw</name>
<email>ben@bdw.to</email>
</author>
<published>2026-02-14T01:58:29+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/commit/?id=28d6d0ea2f86d69ad003557656466a50545fc0c9'/>
<id>urn:sha1:28d6d0ea2f86d69ad003557656466a50545fc0c9</id>
<content type='text'>
Subscription manager:
- Track active subscriptions across connections
- Filter matching with full NIP-01 support
- Event fan-out to matching subscribers

Subscribe RPC:
- Query stored events (past)
- Stream them to client
- Keep stream open for new events (real-time)
- Auto-generate subscription ID if not provided

PublishEvent now:
- Stores event
- Notifies all matching active subscriptions
- Streams to gRPC clients in real-time

4 new tests, all 41 tests passing
</content>
</entry>
<entry>
<title>feat: add gRPC handler with event validation and publishing</title>
<updated>2026-02-14T01:48:36+00:00</updated>
<author>
<name>bndw</name>
<email>ben@bdw.to</email>
</author>
<published>2026-02-14T01:48:36+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/muxstr.git/commit/?id=62d31434ddbadff18580826576e1169f539e23f0'/>
<id>urn:sha1:62d31434ddbadff18580826576e1169f539e23f0</id>
<content type='text'>
Handler implementation:
- EventStore interface (consumer-side)
- Server with PublishEvent, QueryEvents, CountEvents, PublishBatch
- pb.Event &lt;-&gt; nostr.Event conversion helpers
- Signature and ID validation using existing nostr package
- Canonical JSON generation for storage

9 tests passing
</content>
</entry>
</feed>
