Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
205 commits
Select commit Hold shift + click to select a range
28e2fc4
Add files via upload
27180781 May 7, 2026
e5f1062
feat: redesign admin settings UI with categorized visual layout
27180781 May 7, 2026
a8d3a1e
chore: trigger redeploy
27180781 May 7, 2026
72da5a4
feat: integrate Magnet ad platform with frequency rules and lazy loading
27180781 May 7, 2026
925d900
feat: add Magnet click & earnings stats panel in admin
27180781 May 7, 2026
7d87793
fix: ensure chat messages render even if magnet ad logic fails
27180781 May 7, 2026
4bf5dc5
fix: revert chat template to original messages loop, inject ads inline
27180781 May 7, 2026
d753607
fix: revert chat component to pre-magnet state to restore message ren…
27180781 May 7, 2026
85505a0
test: re-add MagnetAdsService injection without template changes
27180781 May 7, 2026
ad7052d
test: add @if ad-slot block in template with plain div placeholder
27180781 May 7, 2026
289756e
test: nest @if inside the existing <nb-list-item>
27180781 May 7, 2026
d6c47af
feat: re-enable magnet ad slot rendering inside the chat list
27180781 May 7, 2026
632210e
feat: render magnet ad inside an admin-style message bubble
27180781 May 7, 2026
7d933ec
feat: add analytics tag injection into <head>
27180781 May 7, 2026
071e50b
docs: document UI redesign, magnet ads, analytics tag, and new endpoints
27180781 May 7, 2026
edc724e
chore: trigger redeploy
27180781 May 7, 2026
6d55d7d
Add multi-tenant role system and channel management foundation
claude May 17, 2026
04cac12
Update auth.go Session to use new GlobalRole/ChannelRole system
claude May 17, 2026
6df0607
Rewrite all backend files for multi-tenant channel support
claude May 17, 2026
257df58
Add global Magnet ads override system for super admin
claude May 17, 2026
0fabb76
Add backend/channel binary to .gitignore
claude May 17, 2026
ea1854a
Add global iframe-ads override system for super admin (same pattern a…
claude May 17, 2026
532f35f
Add super admin panel foundation (frontend, WIP)
claude May 17, 2026
2825add
Complete super admin panel frontend
claude May 17, 2026
581a20f
Add Cloudflare R2 storage with local fallback
claude May 17, 2026
21042ed
Add storage quota system, super admin storage panel, and TinyPNG comp…
claude May 17, 2026
8fc53e7
Add CHANGELOG.md documenting the multi-tenant system
claude May 17, 2026
3680779
Add public landing page with channel request flow
claude May 17, 2026
f360334
Fix multi-tenant isolation, performance, and rate limiting
claude May 18, 2026
ccf083f
Implement all scalability and performance recommendations
claude May 18, 2026
6698a9e
Update Dockerfile
27180781 May 18, 2026
83f49be
Fix per-channel URL routing, OAuth returnUrl, and all API slug paths
claude May 18, 2026
8ff774e
Fix three logic bugs found in flow review
claude May 18, 2026
680ebaa
Fix offline handling: banner, reconnect, missed-message sync
claude May 18, 2026
e4f66ff
Fix scroll jumps and message duplicates on reconnect
claude May 18, 2026
4f13ea7
Fix three regressions: channel switch stale state, empty-messages cra…
claude May 18, 2026
18ac6d3
Fix 9 bugs across channel management, admin panel, and backend reliab…
claude May 18, 2026
b83526b
Fix Docker build: upgrade to Go 1.25, add dep caching, remove go mod …
claude May 18, 2026
f2adf81
chore: normalize Dockerfile AS keyword casing
claude May 18, 2026
6a1f669
Fix duplicate /api/super-admin route causing startup panic
claude May 18, 2026
8efa495
Fix styling flash: suppress landing page until auth check completes
claude May 18, 2026
ee381c4
Remove bootstrap-icons npm package (loaded via CDN)
claude May 18, 2026
ff052c8
chore: trigger redeploy after disk cleanup
claude May 18, 2026
920f31e
Fix super-admin panel: wrap with nb-layout for Nebular theme to apply
claude May 18, 2026
b029d71
Add logout button to super-admin panel header
claude May 18, 2026
51f4e30
Fix ngModel binding in create-channel form: add name attributes
claude May 18, 2026
6b14605
Show channel request form for users without channel access
claude May 18, 2026
71c8a12
Fix channel request approval: auto-lowercase slug before submitting
claude May 18, 2026
80111ad
Add Enter-sends-message setting and paste-image support
claude May 18, 2026
28fec5a
Fix TS2367: cast value comparison to any for boolean setting check
claude May 18, 2026
0069460
Fix 'Enter sends message' setting not working
claude May 18, 2026
834d81d
Move FCM config to super-admin global settings, per-channel toggle only
claude May 18, 2026
9e0571d
Fix settings ownership: move global fields to super-admin, remove bro…
claude May 18, 2026
5e13fa4
Merge audit fixes into master (batch 1/11)
27180781 Aug 10, 2026
25f5caa
Merge audit fixes into master (batch 2/11)
27180781 Aug 10, 2026
352ce13
Merge audit fixes into master (batch 2b/11)
27180781 Aug 10, 2026
2b42ade
Merge audit fixes into master (batch 3/11)
27180781 Aug 10, 2026
46e8bbd
Merge audit fixes into master (batch 4/11)
27180781 Aug 10, 2026
8fc1f97
Merge audit fixes into master (batch 5/11)
27180781 Aug 10, 2026
a4e4bd4
Merge audit fixes into master (batch 6/11)
27180781 Aug 10, 2026
ba36573
Merge audit fixes into master (batch 7/11)
27180781 Aug 10, 2026
bebf85e
Merge audit fixes into master (batch 8/11)
27180781 Aug 10, 2026
9d115d9
Merge audit fixes into master (batch 9/11)
27180781 Aug 10, 2026
0a8955c
Merge audit fixes into master (batch 10/16)
27180781 Aug 10, 2026
9222153
Merge audit fixes into master (batch 11/16)
27180781 Aug 10, 2026
4b1852c
Merge audit fixes into master (batch 12/16)
27180781 Aug 10, 2026
b784679
Merge audit fixes into master (batch 13/16)
27180781 Aug 10, 2026
ac944d2
Merge audit fixes into master (batch 14/16)
27180781 Aug 10, 2026
f35bae0
Merge audit fixes into master (batch 15/16)
27180781 Aug 10, 2026
5ee9be2
Merge audit fixes into master (batch 16/17)
27180781 Aug 10, 2026
e4a229f
Merge audit fixes into master (batch 17/17)
27180781 Aug 10, 2026
274cd5a
Second audit fixes (batch 1/10)
27180781 Aug 17, 2026
c623928
Second audit fixes (batch 1/10, fix)
27180781 Aug 17, 2026
886c4d9
Second audit fixes (batch 1/10, fix 2)
27180781 Aug 17, 2026
ed790fb
Second audit fixes (batch 2/10)
27180781 Aug 17, 2026
e19a229
Second audit fixes (batch 3/10)
27180781 Aug 17, 2026
fb15436
Second audit fixes (batch 4/10)
27180781 Aug 17, 2026
d672afb
Second audit fixes (batch 5/10)
27180781 Aug 17, 2026
d89eda4
Second audit fixes (batch 5/10, fix)
27180781 Aug 17, 2026
110e403
Second audit fixes (batch 6/10)
27180781 Aug 17, 2026
60e756a
Second audit fixes (batch 7/10)
27180781 Aug 17, 2026
00d33f9
Second audit fixes (batch 8/10)
27180781 Aug 17, 2026
431881e
Second audit fixes (batch 9/10)
27180781 Aug 17, 2026
49e0fa4
Second audit fixes (batch 10/12)
27180781 Aug 17, 2026
d6d8a8b
Second audit fixes (batch 11/12)
27180781 Aug 17, 2026
a9a12a5
Second audit fixes (batch 12/12)
27180781 Aug 17, 2026
628e355
Self-service channel creation (batch 1/6)
27180781 Aug 17, 2026
92921fd
Self-service channel creation (batch 2/6)
27180781 Aug 17, 2026
21b2926
Self-service channel creation (batch 3/6)
27180781 Aug 17, 2026
99e28bf
Self-service channel creation (batch 4/6)
27180781 Aug 17, 2026
3469161
Self-service channel creation (batch 5/6)
27180781 Aug 17, 2026
d4b1d3d
Self-service channel creation (batch 6/6)
27180781 Aug 17, 2026
3690eb5
Stop charging rate-limit quota for requests that create nothing
27180781 Aug 17, 2026
d126cf4
Make Google sign-in the only way to open a channel, and land on a set…
27180781 Aug 17, 2026
a171bc6
Make Google sign-in the only way to open a channel, and land on a set…
27180781 Aug 17, 2026
d79b6b2
Remove ChannelRequestService — its only member submitted the public c…
27180781 Aug 17, 2026
bba484f
Make Google sign-in the only way to open a channel, and land on a set…
27180781 Aug 17, 2026
82c5b59
Add an in-app guide for channel owners, and transliterate Hebrew into…
27180781 Aug 17, 2026
920b12b
Add an in-app guide for channel owners, and transliterate Hebrew into…
27180781 Aug 17, 2026
3038e6f
Add an in-app guide for channel owners, and transliterate Hebrew into…
27180781 Aug 17, 2026
f748513
Log why an upload failed, and migrate existing local files into R2
27180781 Aug 17, 2026
26f4229
Add a platform attribution strip to the channel view
27180781 Aug 17, 2026
83c1952
Add DEPLOY.md
27180781 Aug 17, 2026
882c776
Fix blank page for anonymous visitors, and load feed images lazily
claude Aug 17, 2026
7c403c7
Record image dimensions at upload time so the feed reserves their space
claude Aug 17, 2026
e234b31
Send cache headers for index.html and the hashed bundles
claude Aug 17, 2026
9107e3f
Pin the attribution strip to the top of the channel
claude Aug 17, 2026
e9d41b5
Add support tickets: contact the operator, and reply back
claude Aug 17, 2026
a10e039
Fix a CSRF hole, an SSE pool exhaustion, and quota/auth defects
claude Aug 18, 2026
efcfe9c
Fix stored XSS in the message renderer, and three concurrency defects
claude Aug 18, 2026
cab7cb5
Block webhook SSRF, and bound three unbounded Redis workloads
claude Aug 18, 2026
e5b064c
Close a cross-tenant blob-deletion race and three more unbounded paths
claude Aug 18, 2026
e897cce
Fan out SSE from one reader per channel instead of one per viewer
claude Aug 18, 2026
f701760
Attach the class the admin panel's scroll rule was written against
claude Aug 18, 2026
bb11ce5
Warn when the global magnet config applies to no channel
claude Aug 22, 2026
61bfc5c
Compare SSE stream ids numerically in the catch-up dedup
claude Aug 27, 2026
0959d36
Close a subscribe/retire race in the SSE hub
claude Aug 27, 2026
f0a5992
Sanitize rendered message HTML with DOMPurify — close raw-HTML stored…
claude Aug 27, 2026
fb0a9d5
Fix edit-channel-info blanking, report flood, and five smaller backen…
claude Aug 27, 2026
2f0b28d
Fix stale channel caches, a contact-link XSS, and a silently empty feed
claude Aug 27, 2026
c07ea82
Add an admin-panel close button, and two backend cleanups
claude Aug 27, 2026
ec2d477
Extract the duplicated storage formatting into one shared util
claude Aug 27, 2026
a02133a
Record dompurify as a direct dependency in the lockfile
claude Aug 27, 2026
ab68ace
Fix: every message rendered empty — marked hooks needs a real Hooks i…
claude Sep 13, 2026
b2ecf66
Add a "my channel" page with the direct link and instructions
claude Sep 13, 2026
4871848
Sign every operator reply to a support ticket as "ניהול"
claude Sep 24, 2026
6a785f9
Show "ניהול" instead of the operator's identity on posts, reports and…
claude Sep 24, 2026
e4bdc6f
Record the directly imported modules in go.mod
claude Sep 24, 2026
d9e6e2c
Backend audit fixes: roles, limits, scheduler, push, SSE, imports
claude Sep 24, 2026
90f3557
Frontend audit fixes: not-found state, push per channel, forms, feed
claude Sep 24, 2026
c1f12f3
Docs: correct SET.md to the current two-level admin model
claude Sep 24, 2026
3e50d82
Close the gaps a review of the operator anonymisation found
claude Sep 24, 2026
6f29c89
Backend: count views on revalidated loads, bound subscriptions, sync …
claude Sep 24, 2026
b5a6bb0
Backend: looser lookup-side slug check, login limiter headroom, tidy-ups
claude Sep 24, 2026
34479a0
Files: named private-R2 downloads, safer auto-cleanup, bounded uploads
claude Sep 24, 2026
685d1c0
Sandbox owner ad code, atomic feature flags, index and limit fixes
claude Sep 24, 2026
6944eea
Docs: describe the isolated frame the magnet snippet runs in
claude Sep 24, 2026
c727d5b
Backend: atomic reactions, support ticket isolation, scheduler and mi…
claude Sep 25, 2026
bd2484f
Frontend: feed jump instead of crawl, sanitizer hardening, admin form…
claude Sep 25, 2026
341ed97
Deploy and docs: favicon in the image, single Redis address, R2 place…
claude Sep 25, 2026
3ec947f
Review fixes: scheduler lock wait, settings validation on changed val…
claude Sep 25, 2026
05161ce
Cross-check leftovers: support index on reply, SSE hub retirement, sc…
claude Sep 29, 2026
e1ac601
Never show the operator's name or login to other users (#3)
27180781 Oct 4, 2026
5ed5a30
Merge master (operator anonymisation, #3) into the channels audit
claude Oct 4, 2026
3dd94b5
סריקת מערכת הערוצים: אבטחה, אטומיות, פריסה ו-frontend (#4)
27180781 Oct 4, 2026
736f830
יסודות לשדרוג חוויית הערוצים: ערכת מותג, חבילה רזה, עמוד ניהול, רשימת…
claude Oct 6, 2026
b8ee1ea
תצוגה מקדימה לקישורים, אייקוני מותג, זרם SSE מחוץ לדחיסה, גיליון סגנו…
claude Oct 6, 2026
18844dd
סקריפטים: תת-חבילת אייקוני Eva ובדיקת מחלקות Bootstrap מול ה-CSS המקומפל
claude Oct 6, 2026
4c83f63
כל המסכים מחדש: נחיתה, כניסה, פתיחת ערוץ, הערוצים שלי, עמוד הערוץ, ני…
claude Oct 6, 2026
0f33eb6
תיקוני הסקירה האדוורסרית ותפריטים שנשארו מתים בגלל tooltip
claude Oct 6, 2026
9f5458b
תיקון 28 ממצאי הסריקה בדפדפן: מעבר בין ערוצים, מקלדת בתפריטי הכותרת, …
claude Oct 7, 2026
9962693
ארבעת השאריות מהאימות החוזר: גזירת כתובת, כרטיס "לא נמצא" למחובר, ריפ…
claude Oct 7, 2026
8d6a9a7
הסרת שני קובצי לוג של סוכני האימות שנכנסו בטעות לקומיט הקודם
claude Oct 7, 2026
284e465
Merge pull request #5: שיפור מערכת הערוצים (claude/channels-ux-overha…
27180781 Oct 11, 2026
b43d73a
סטטיסטיקת מגנט: מפתח סטטיסטיקה נפרד במקום מפתח ההטמעה (F37 במגנט)
claude Oct 13, 2026
e18b5e3
פרסומות מגנט: מזהה גולש יציב בכל המסגרות של ערוץ, וסלוט ריק נסגר מיד
claude Oct 14, 2026
8a7f00d
פרסומות מגנט: תיקוני הסקירה העצמאית
claude Oct 14, 2026
638bc32
פרסומות מגנט: מזהה גולש אחד לערוץ, וסלוט בלי פרסומת נסגר מיד (#8)
27180781 Oct 14, 2026
a859bdf
CLAUDE.md: כללי עבודה קצרים במאגר (#7)
27180781 Oct 14, 2026
08e26e0
סופר-אדמין: בחירת ערוצים נעולים מרשימה עם חיפוש
claude Oct 14, 2026
e249dc2
global-magnet: משאירים את newLockedChannel ואת .locked__add כדי שהמיז…
claude Oct 14, 2026
e1f9609
CI: בניית הפרונט ובדיקות ה-backend על כל PR
claude Oct 14, 2026
64fc9e1
CI: בניית הפרונט ובדיקות ה-backend על כל PR
claude Oct 14, 2026
fb8d868
CI: workflow build (כמו ב-PR #10) כדי לבנות את ה-PR לפני מיזוג
claude Oct 14, 2026
32c1981
Merge pull request #6 from 27180781/claude/project-thread-5wjcl5
27180781 Oct 14, 2026
3f7e01b
Move the platform credit into the channel header
claude Oct 14, 2026
528ba7d
Leave a pixel of slack when fitting the credit beside the name
claude Oct 14, 2026
034b9f9
SEO: robots.txt, sitemap, תגיות ותוכן בצד השרת, דפי מדריך ואימות Sear…
claude Oct 14, 2026
a006dd5
בדיקות SEO: תאריך lastmod אחרי יצירת הערוץ, ובדיקת ביקורות לפי הסוג ו…
claude Oct 14, 2026
f420232
Merge master (PR #6) into the channel picker
claude Oct 14, 2026
4bd5db8
מיילים דרך מגנט: ערוץ נפתח + תשובת "ניהול" לפנייה
claude Oct 14, 2026
ed61eac
מגנט: 409 in_progress נשלח שוב, שדות בשורה אחת, כתובת הפונקציה בתיעוד
claude Oct 14, 2026
6a5f0f7
Merge pull request #10 from 27180781/claude/ci-build
27180781 Oct 14, 2026
e5e21e6
Merge pull request #9 from 27180781/claude/channel-picker-k7q
27180781 Oct 14, 2026
12233c5
Merge pull request #11 from 27180781/claude/header-credit-h7q
27180781 Oct 14, 2026
332755b
Merge pull request #12 from 27180781/claude/channels-seo-k7m2
27180781 Oct 14, 2026
f4149d7
Merge remote-tracking branch 'origin/master' into claude/channels-mail
claude Oct 14, 2026
90d7a4a
SEO שלב 2: הגדרות חיפוש לכל ערוץ, דף נטפרי ודף חלופה לוואטסאפ
claude Oct 14, 2026
1ae631b
Merge pull request #14 from 27180781/claude/channels-mail
27180781 Oct 14, 2026
2920566
SEO שלב 2: הגדרות מנועי חיפוש במסך פרטי הערוץ ובסופר-אדמין
claude Oct 14, 2026
8243c11
Super admin: Magnet stats as a real screen, not a key/value table
claude Oct 14, 2026
4b53b43
Remove the super-admin "channel requests" screen
claude Oct 14, 2026
3d4a9bc
Merge pull request #15 from 27180781/claude/channels-seo-2-n7q4
27180781 Oct 14, 2026
56f3e53
Merge pull request #16 from 27180781/claude/magnet-stats-ui-r7d
27180781 Oct 14, 2026
a3dd9f7
Merge remote-tracking branch 'origin/master' into claude/remove-chann…
claude Oct 14, 2026
ede3d85
Merge pull request #17 from 27180781/claude/remove-channel-requests-q7k2
27180781 Oct 14, 2026
cf9cfd3
Support: mail to the channels mailbox joins the support inbox
claude Oct 15, 2026
6b1a525
Support inbound: sweep the per-sender limiter map
claude Oct 15, 2026
807ebca
Channel created: tell the owner to look for the welcome mail in spam
claude Oct 15, 2026
8e330cb
Channel's own Magnet stats for unlocked channels; nothing for locked …
claude Oct 15, 2026
2e86897
Merge pull request #18 from 27180781/claude/channels-inbound-k3m
27180781 Oct 15, 2026
29653d1
Merge pull request #20 from 27180781/claude/channel-own-stats-k4m
27180781 Oct 15, 2026
393a7fc
סופר-אדמין: נקודה אדומה עם מספר הפניות שממתינות לתשובה על "פניות למערכת"
claude Oct 15, 2026
60598ec
Merge pull request #21 from 27180781/claude/support-unread-dot
27180781 Oct 15, 2026
b1eb8f1
Merge pull request #19 from 27180781/claude/created-mail-spam-note
27180781 Oct 15, 2026
21cc2d0
Serve Google Search Console verification file
claude Oct 15, 2026
a698378
Speed up channel loading: cache file redirects, prefetch the feed
claude Oct 15, 2026
3c39f6e
Merge pull request #22 from 27180781/claude/google-verification-file
27180781 Oct 15, 2026
40356f8
Merge pull request #23 from 27180781/claude/channels-speed
27180781 Oct 15, 2026
a17cbc3
Make channel posts findable in search
claude Oct 15, 2026
02ea2e5
Merge pull request #24 from 27180781/claude/channel-posts-seo
27180781 Oct 15, 2026
3df11f6
Add privacy policy and terms of service pages
claude Oct 15, 2026
fe31d81
Merge pull request #25 from 27180781/claude/privacy-terms
27180781 Oct 15, 2026
e9dec51
Add a ready NetFree unblock request with the channel address
claude Oct 16, 2026
c28ba9f
Merge pull request #26 from 27180781/claude/netfree-request-text
27180781 Oct 16, 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
39 changes: 39 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Build artifacts and dependencies — these are regenerated inside the image.
# Without this file the whole 600MB+ node_modules tree is sent to the Docker
# daemon as build context and copied into the builder layer, which exhausts
# disk space on the build host.
frontend/node_modules/
frontend/dist/
frontend/.angular/

# Go build output and debug binaries
backend/the-channel
backend/channel
backend/__debug*

# Local runtime state — must never leak into an image
caddy_data/
caddy_config/
redis_data/
channel_data/
data/
.env
# A developer's redis-server writes its snapshot/AOF into the cwd it was
# started from (backend/ during tests); `COPY ./backend .` would ship it.
**/dump.rdb
**/appendonly.aof
**/appendonlydir/

# VCS and editor noise
.git/
.gitignore
.vscode/
.idea/
**/.DS_Store
**/.ds_store

# Docs and local-only compose config
*.md
docker-compose.yml
kvrocks.conf
Caddyfile
46 changes: 46 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: build

on:
pull_request:
push:
branches: [master]

concurrency:
group: build-${{ github.ref }}
cancel-in-progress: true

jobs:
frontend:
runs-on: ubuntu-latest
defaults:
run:
working-directory: frontend
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: frontend/package-lock.json
- run: npm ci --no-audit --no-fund
- run: npm run build

backend:
runs-on: ubuntu-latest
services:
redis:
image: redis:7
ports: ["6379:6379"]
defaults:
run:
working-directory: backend
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: backend/go.mod
cache-dependency-path: backend/go.sum
- run: go vet ./...
- run: go test ./...
env:
REDIS_ADDR: 127.0.0.1:6379
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,18 @@ frontend/node_modules/
frontend/dist/*
package-lock.json
backend/__debug*
backend/channel
caddy_data/
redis_data/
channel_data/*
caddy_config/
data/kvrocks.sock
.env
.ds_store
.ds_store
# Redis writes its snapshot into the cwd of whoever started it (tests)
dump.rdb
**/dump.rdb
appendonly.aof
**/appendonly.aof
appendonlydir/
**/appendonlydir/
Loading