Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
284 commits
Select commit Hold shift + click to select a range
f77cfd0
Merge pull request #612 from Damola09/feat/routes-f-viewer-history
davedumto Apr 26, 2026
011aad9
Merge pull request #611 from Damola09/feat/routes-f-registration
davedumto Apr 26, 2026
2e653b9
feat: add routes-f word, contrast, timezone, and date diff endpoints
CMI-James Apr 26, 2026
9f6a7ad
feat: add clips, whitelist, feature flags, and user preferences
johnsmccain Apr 26, 2026
3db05c1
feat(api): add configurable fizzbuzz endpoint with custom rules and t…
uboho-prog Apr 26, 2026
3dd3377
feat(routes-f): base64 encode/decode endpoint with url-safe variant
logantalen Apr 26, 2026
8492a5e
feat(routes-f): currency converter with static rates
logantalen Apr 26, 2026
f5ac0fc
feat(routes-f): jwt decoder endpoint for debugging
logantalen Apr 26, 2026
1868792
feat(routes-f): markdown preview endpoint with safe HTML rendering
logantalen Apr 26, 2026
3444855
feat(routes-f): anonymous feedback endpoint with rate limiting
Agbasimere Apr 26, 2026
d1d629e
chore: trigger ci
Agbasimere Apr 26, 2026
23297d6
Merge remote-tracking branch 'upstream/dev' into feat/566-feedback-en…
Agbasimere Apr 26, 2026
4d2fa73
fix(word-frequency): remove duplicate 'right' key in corpus
Agbasimere Apr 26, 2026
bf4e180
fix(routes-f-feedback): satisfy lint rules
Agbasimere Apr 26, 2026
efaf669
chore(lint): unblock ci by fixing curly + unused-vars across routes-f
Agbasimere Apr 26, 2026
4c2a9ba
dtrsmfi frontnd implementation
wandooadzer-cmyk Apr 26, 2026
fefdfb3
Merge pull request #638 from Johnsmichael150/dev
davedumto Apr 26, 2026
5528c6d
feat(routes-f): feature flags, event ingestion, uuid generator, slugi…
nonsobethel0-dev Apr 27, 2026
f8db5d0
Merge pull request #644 from nonsobethel0-dev/feat/issues-560-561-562…
davedumto Apr 27, 2026
d59c78d
feat(routes-f): avatar-from-initials SVG generator (#582)
nonsobethel0-dev Apr 27, 2026
3e47190
Merge pull request #642 from wandooadzer-cmyk/me/wave-4
davedumto Apr 27, 2026
7c0c6f5
feat(routes-f): add email validator with disposable/role checks
od-hunter Apr 27, 2026
6369eb9
feat(routes-f): items catalog, referral program, viewer presence, and…
ALIPHATICHYD Apr 27, 2026
152062b
Merge pull request #645 from nonsobethel0-dev/feat/issues-560-561-562…
davedumto Apr 27, 2026
d9368cb
fix: unblock typecheck for feature flags and corpus
od-hunter Apr 27, 2026
b78fe5c
feat(routes-f): items catalog, referral program, viewer presence, and…
ALIPHATICHYD Apr 27, 2026
bf19c8e
Merge pull request #1 from ALIPHATICHYD/feat/routes-f-items-referrals…
ALIPHATICHYD Apr 27, 2026
6c350ba
Merge branch 'StreamFi-x:dev' into dev
ALIPHATICHYD Apr 27, 2026
97d7776
feat(routes-f): implement four API endpoints - HTTP status lookup, de…
Nanle-code Apr 27, 2026
5a9be57
feat(routes-f): implement stream extensions, obs overlay, co-streamer…
Emmy123222 Apr 27, 2026
bd0cdbc
Merge pull request #680 from Nanle-code/feat/routes-f-api-endpoints
davedumto Apr 27, 2026
1867e0d
feat(routes-f): add cron validator, coin-flip streak, tic-tac-toe val…
akintewe Apr 27, 2026
aedf37c
Merge pull request #692 from Emmy123222/feat-backend-enhancements-mul…
davedumto Apr 27, 2026
effddf7
Merge pull request #679 from ALIPHATICHYD/dev
davedumto Apr 27, 2026
8eef8e1
feat(routes-f): percentile, loan amortization, xml-to-json, pace
tosin-zoffun Apr 27, 2026
0886784
feat(routes-f): pearson correlation endpoint (#691)
oluebubejoy Apr 27, 2026
70709a7
feat(routes-f): add in-memory URL shortener endpoints
Apr 27, 2026
74fecda
Merge pull request #640 from logantalen/feat/utility-endpoints-557-57…
davedumto Apr 27, 2026
3391d9c
feat: add routes-f preview, profile, spell-check, and json-validator …
HasToBeJames Apr 27, 2026
426084e
Merge branch 'dev' into feat/pearson-correlation-api
davedumto Apr 27, 2026
f05a7c2
Merge pull request #709 from oluebubejoy/feat/pearson-correlation-api
davedumto Apr 27, 2026
6b7be04
Merge pull request #706 from tosin-zoffun/feat/682-683-688-690-pace-x…
davedumto Apr 27, 2026
784bed7
Merge branch 'dev' into feat/routes-f-email-validate-main
od-hunter Apr 27, 2026
419c2a2
Merge branch 'dev' into feat/566-feedback-endpoint
Agbasimere Apr 27, 2026
c8395d1
feat(routes-f): bookmarks, password-gen, sentence-tokenize, time-ago
harystyleseze Apr 27, 2026
17dfe68
fix(user-agent): replace ReDoS-prone trailing-strip regex
Agbasimere Apr 27, 2026
d0fca15
Merge branch 'feat/566-feedback-endpoint' of https://github.com/Agbas…
Agbasimere Apr 28, 2026
0ad1200
chore(lint): allow _-prefixed unused vars + ts-nocheck; drop dead vars
Agbasimere Apr 28, 2026
47a1204
chore(lint): wrap single-statement if/while bodies in braces
Agbasimere Apr 28, 2026
9baf8bd
Merge pull request #712 from harystyleseze/dev
davedumto Apr 28, 2026
95cda66
Merge pull request #711 from HasToBeJames/codex/routes-f-preview-spel…
davedumto Apr 28, 2026
a6561d4
Merge pull request #710 from lifewithbigdamz/feat/url-shortener-endpo…
davedumto Apr 28, 2026
a8f15c7
Merge pull request #704 from TheDEV111/feat-routes-text-stats-endpoin…
davedumto Apr 28, 2026
bd749bd
Merge pull request #703 from akintewe/feat/routes-f-utilities
davedumto Apr 28, 2026
1b67390
Merge pull request #681 from od-hunter/feat/routes-f-email-validate-main
davedumto Apr 28, 2026
5c7b501
Merge pull request #641 from Agbasimere/feat/566-feedback-endpoint
davedumto Apr 28, 2026
fc5d630
Merge pull request #639 from uboho-prog/route-f-configure-fizzbuzz
davedumto Apr 28, 2026
d72e4f1
Merge branch 'dev' into codex/routes-f-558-616-629-632
davedumto Apr 28, 2026
7a7c476
Merge pull request #637 from CMI-James-OD/codex/routes-f-558-616-629-632
davedumto Apr 28, 2026
b0926d4
Merge pull request #610 from Damola09/feat/routes-f-2fa
davedumto Apr 28, 2026
986a50a
feat(routes-f): add regression, unicode info, sentiment, and random g…
Gbangbolaoluwagbemiga Apr 28, 2026
e1d8428
Merge pull request #713 from Williams-1604/feat-702-693-698-687-routes-f
davedumto Apr 28, 2026
d051227
Merge pull request #609 from Damola09/feat/routes-f-validation-rules
davedumto Apr 28, 2026
ab9aa45
Merge pull request #607 from sparynx/feat/viewer-history-api
davedumto Apr 28, 2026
81181b4
Merge pull request #606 from Whiznificent/feat/session-management-api
davedumto Apr 28, 2026
be35f20
feat: add routes-f sudoku country csv and mime APIs
Codex-Agent Apr 28, 2026
6c242c0
Merge pull request #601 from Peolite001/dev
davedumto Apr 28, 2026
d150a90
feat(routes-f): add pii redactor endpoint with luhn card detection
Chucks1093 Apr 28, 2026
0a7b81d
Merge pull request #715 from opascal221-design/feat/close-685-689-696…
davedumto Apr 28, 2026
3d840a0
Merge pull request #714 from Themancalledpg/codex/feat-routes-f-sudok…
davedumto Apr 28, 2026
ac0c92e
feat(routes-f): add semver and CIDR utility endpoints
toni-toni2 Apr 28, 2026
69c0973
Merge pull request #717 from toni-toni2/feature/routes-f-semver-cidr-…
davedumto Apr 28, 2026
1e838f3
feat(routes-f): add workdays calculator and regex tester endpoints
adetumilara Apr 28, 2026
b67a7b6
feat(routes-f): add bmi, threaded comments, raffle, and url encode AP…
josephchimebuka Apr 28, 2026
16c0392
feat(routes-f): add four calculator and entertainment endpoints
Nanle-code Apr 28, 2026
43e7d23
feat: implement routes-f API endpoints
ThatCodeBabe Apr 28, 2026
e30d419
Merge pull request #719 from dragoncode-01/feat/routes-f-calculators-…
davedumto Apr 28, 2026
d6ae24b
Merge pull request #720 from josephchimebuka/feat/routes-f-threaded-u…
davedumto Apr 28, 2026
d7eb9c4
Merge pull request #718 from adetumilara/feature/routes-f-workdays-re…
davedumto Apr 28, 2026
5c05423
Merge pull request #721 from ThatCodeBabe/feat/routes-f-api-endpoints
davedumto Apr 28, 2026
7fb7176
feat(routes-f): implement profanity filter, webhook demo, text diff, …
codegeni3 Apr 28, 2026
dbe3c80
feat(routes-f): add domain validator with idn+tld checks
Chucks1093 Apr 28, 2026
c1d7466
Merge pull request #722 from codegeni3/dev
davedumto Apr 28, 2026
055ddec
Merge pull request #724 from aniokedianne/feat/close-653-671-672-675
davedumto Apr 28, 2026
90c97ae
feat(routes-f): add palette and distance endpoints (#565 #586)
edehvictor Apr 28, 2026
345dcb4
Merge pull request #745 from edehvictor/fix-palette-distance-565-586
davedumto Apr 28, 2026
89b9aeb
feat(routes-f): add seeded fake users endpoint (#574)
edehvictor Apr 28, 2026
dc2abde
feat(routes-f): triangle math from sides or vertices (#731)
KevinMB0220 Apr 29, 2026
62155a4
feat(routes-f): mortgage payment and amortization calculator (#732)
KevinMB0220 Apr 29, 2026
4edc9a7
feat(routes-f): url parser with query and fragment breakdown (#735)
KevinMB0220 Apr 29, 2026
3e0ad4d
feat(routes-f): query string parser and builder (#736)
KevinMB0220 Apr 29, 2026
c70c117
Merge pull request #747 from KevinMB0220/feat/routes-f-731-732-735-736
davedumto Apr 29, 2026
336c854
feat: add routes-f utilities and subscription gating
CMI-James Apr 29, 2026
313e204
feat(routes-f): add random paragraph generator
codebestia Apr 29, 2026
7166217
feat(routes-f): add accept-language parser
codebestia Apr 29, 2026
b89c7b5
feat(routes-f): add combinatorics endpoint
codebestia Apr 29, 2026
54b0d30
feat(routes-f): add ip address validator
codebestia Apr 29, 2026
7914d20
Merge pull request #749 from codebestia/feat/drips-pr
davedumto Apr 29, 2026
0af1969
Merge pull request #748 from Jay-Peter-Egemasi/codex/feat-routes-f-wh…
davedumto Apr 29, 2026
cc4b4dd
feat(routes-f): implement apikey, macro, hashtag, and text reverse APIs
Agbeleshe Apr 30, 2026
bdaf6e9
Merge pull request #750 from Agbeleshe/feat/routes-f-utilities
davedumto Apr 30, 2026
5c35b34
Merge pull request #746 from edehvictor/fix-fake-users-574
davedumto May 2, 2026
1001271
Merge pull request #605 from TochukwuJustice/fix/converter-route
davedumto May 2, 2026
b453d99
Merge pull request #604 from TochukwuJustice/fix/lorem
davedumto May 2, 2026
acc96b0
Merge pull request #602 from Olisachukwuma1/feat/magic-8-ball-api
davedumto May 2, 2026
9384a47
Merge pull request #600 from OsejiFabian/feature/dice-roll-endpoint
davedumto May 2, 2026
b783ecb
Merge pull request #599 from Nacho1499/feat/password-strength-checker…
davedumto May 2, 2026
c52539a
Merge pull request #594 from jotel-dev/dev
davedumto May 2, 2026
4019688
Merge pull request #593 from Simongodw/feat/trivia-question-bank
davedumto May 2, 2026
246ebc7
Merge pull request #592 from AJtheManager/feat/hash-endpoint
davedumto May 2, 2026
2e0fd9f
Merge pull request #595 from lemarjohnny781/feat/transcription-api
davedumto May 2, 2026
099ab68
chore(routes-f): remove completed practice endpoints for re-issuing
davedumto May 18, 2026
111dbf1
feat(routes-f): add robots and notation utilities
edehvictor May 26, 2026
f083dbc
Merge pull request #910 from edehvictor/fix/routes-f-robots-notation-…
davedumto May 26, 2026
38db498
feat(routesF): add clamp normalize endpoint
nomsoscript May 26, 2026
961d57d
System.Collections.Hashtable.message
nomsoscript May 26, 2026
98a23e8
System.Collections.Hashtable.message
nomsoscript May 26, 2026
407d3c7
System.Collections.Hashtable.message
nomsoscript May 26, 2026
ce1117e
Merge pull request #911 from nomsoscript/codex/feat-routesf-numeric-8…
davedumto May 26, 2026
a273c74
feat(routes-f): add percentage-change, char-frequency, hex-dump, and …
Themancalledpg May 26, 2026
dc3050c
Merge pull request #912 from Themancalledpg/feat/routes-f-utilities-8…
davedumto May 26, 2026
60cb1ed
fix: resolve all pre-commit type errors and add missing route files
promisszn May 26, 2026
b815124
feat(routes-f): hex-color, checksums, fiscal-quarter, and address-gen…
DeJune06 May 26, 2026
295b5f2
Merge pull request #914 from DeJune06/feat/routes-f-utilities-819-822…
davedumto May 26, 2026
c9be3a9
feat(routes-f): collatz, case-convert, hamming utilities + donations …
Mawuli-tech May 27, 2026
5180fb9
feat(routes-f): base32, country-flag, json-schema validator, initials…
chigozirim007 May 27, 2026
b26cfac
feat(routes-f): continent, base64-validate, rounding, team-name utili…
pre-cious-Igwealor May 27, 2026
52ed25c
Merge pull request #915 from Mawuli-tech/feat/routes-f-466-817-824-861
davedumto May 27, 2026
99dc113
Merge pull request #916 from chigozirim007/feat/routes-f-799-805-806-810
davedumto May 27, 2026
4187630
Merge pull request #917 from pre-cious-Igwealor/feat/routes-f-830-842…
davedumto May 27, 2026
3038ace
feat(routesF): project codename generator (closes #829)
emdevelopa May 27, 2026
4c89d63
feat(routesF): zodiac sign from date (closes #838)
emdevelopa May 27, 2026
7652a92
feat(routesF): luhn check digit generator (closes #856)
emdevelopa May 27, 2026
60754d3
feat(routesF): slug format validator (closes #840)
emdevelopa May 27, 2026
f5cdc19
Merge pull request #918 from devpeter999/feat/routesF-issues
davedumto May 27, 2026
ec53190
Add scoped routes-f utilities: duration parser/formatter, nth-prime, …
johnsmccain May 27, 2026
12de045
Merge branch 'StreamFi-x:dev' into dev
johnsmccain May 27, 2026
ec6156c
Merge pull request #919 from johnsmccain/dev
davedumto May 27, 2026
667d8b4
Merge branch 'dev' into dev
promisszn May 27, 2026
da45754
feat(emoji-picker): add seeded categorized emoji picker route
Marvell69 May 27, 2026
b7a99da
header parser
Marvell69 May 27, 2026
154ff2b
feat(routes-f): add break-even and perfect-power routes
Marvell69 May 27, 2026
a38acbe
feat(routesF): add ROI calculator, MIME magic, word wrap, dedupe-by-k…
May 27, 2026
3ca6a61
Merge pull request #922 from Marvell69/feat/routes-f
davedumto May 27, 2026
163dee5
feat: implement 4 routesF API endpoints
Emmy123222 May 27, 2026
ab25dd0
Merge pull request #924 from Emmy123222/feat/routesF-four-endpoints
davedumto May 27, 2026
81bdaf0
feat: add leap year, z-score, json format, and business hours routes
Chucks1093 May 27, 2026
693705d
Merge pull request #923 from oomokaro1/feat/routesF-roi-mimetypes-wra…
davedumto May 27, 2026
8dd0e35
merge: resolve conflicts with dev branch
Chucks1093 May 27, 2026
bf7a073
Merge pull request #926 from Chucks1093/feat/utility-routes-818-859-8…
davedumto May 27, 2026
10a6348
feat: add unix iso conversion route
kryputh May 28, 2026
6b04ce4
feat(routesF): add CSS named color dataset
fortezzalaboratory May 28, 2026
e0b9dcc
feat(routesF): add seeded shuffle utility
fortezzalaboratory May 28, 2026
1adf5d5
feat(routesF): add random named color picker route
fortezzalaboratory May 28, 2026
8cb7dec
test(routesF): cover group filters and deterministic seed
fortezzalaboratory May 28, 2026
572dd5b
test(routesF): add default and count-bound coverage
fortezzalaboratory May 28, 2026
04bca4e
Add utility API routes for jokes, dates, smoothing, and determinants
devsimze May 28, 2026
abda12b
Merge pull request #932 from Abidoyesimze/feat/routes-828-837-884-893
davedumto May 28, 2026
efc4227
feat(routesF): add magic square, maze, levenshtein, and weekday routes
ACOB-DEV May 28, 2026
ea39fec
Merge pull request #934 from ACOB-DEV/codex/feat-routesF-888-897-906-908
davedumto May 28, 2026
8c9b6a0
Adding issues
Timi16 May 28, 2026
d03d290
Merge pull request #935 from Timi16/dev
davedumto May 28, 2026
10a7bf9
feat: add routesF utilities, sudoku, and fibonacci endpoints
CMI-James May 28, 2026
8eb2896
Merge pull request #933 from CMI-James-OD/codex/routesf-902-907-909-744
davedumto May 28, 2026
0b1f9fc
feat(routes-f): add utility math and card routes
Akpamgbo May 28, 2026
524106a
feat: add routes-f math and date utilities
CMI-James May 28, 2026
4c62a62
Merge pull request #937 from Jay-Peter-Egemasi/codex/feat-routes-f-86…
davedumto May 28, 2026
b09db67
feat(routesF): add SSN validator, compound/simple interest, IRR, and …
aniokedianne May 28, 2026
9f0430d
feat(routes-f): add relative-date parser endpoint (#880)
utahkanz-ops May 28, 2026
849bd55
Merge pull request #938 from aniokedianne/feat/routesF-839-853-894-900
davedumto May 28, 2026
9cc8ad0
Merge pull request #936 from Akpamgbo/codex/862-896-885-882-upstream-dev
davedumto May 28, 2026
15de9c7
feat(routesF): add twin-primes finder endpoint (#891)
utahkanz-ops May 28, 2026
52235b4
feat(routesF): add wrap-search-terms endpoint (#847)
utahkanz-ops May 28, 2026
9642b38
feat: resolve issues #804 #808 #811 #813 — four routes-f/routesF util…
JamesVictor-O May 28, 2026
b60471e
Merge pull request #944 from codeX-james/codex/feat-813-811-808-804
davedumto May 28, 2026
69b7ead
feat(routes-f): sieve of eratosthenes
williamedvard May 28, 2026
e6e57c9
feat(routesF): acronym generator
williamedvard May 28, 2026
91abec2
feat(routesF): whitespace normalizer
williamedvard May 28, 2026
a14c01f
feat(routesF): qr payload builder
williamedvard May 28, 2026
52f84c8
Merge pull request #945 from williamedvard/add-routesf-features
davedumto May 29, 2026
b6b9b21
feat: add routes-f bingo dice entropy and syllable endpoints
HasToBeJames May 29, 2026
83e2c9a
feat(routesF): add happy number & caesar brute force
testersweb0-bug May 29, 2026
d2f44dc
Merge pull request #946 from HasToBeJames/codex/routes-f-883-887-881-901
davedumto May 29, 2026
3b629a9
Merge pull request #947 from testersweb0-bug/feat/routesF-phonetic-ci…
davedumto May 29, 2026
158c7b3
feat(routes-f, routesF): add easter calculator, pagination, card expi…
logantalen May 29, 2026
411ca50
Merge branch 'dev' into dev
promisszn May 29, 2026
3975937
Merge pull request #948 from logantalen/feat/utilities-easter-paginat…
davedumto May 29, 2026
7e6b7e9
feat: ratio, savings, etag
anonfedora May 29, 2026
bc97e76
Merge pull request #949 from anonfedora/feat/ratio-savings-etag
davedumto May 29, 2026
0ffa201
feat(routesF): add roman numeral validator
codebestia May 30, 2026
359868f
Merge pull request #950 from codebestia/feat/drips-pr-wave
davedumto May 30, 2026
d82a476
Merge pull request #940 from utahkanz-ops/feat/relative-date-parser-8…
davedumto May 31, 2026
f07d881
Merge pull request #941 from utahkanz-ops/feat/twin-primes-891
davedumto May 31, 2026
db30804
Merge pull request #942 from utahkanz-ops/feat/wrap-search-terms-847
davedumto May 31, 2026
e2aa3ae
Merge pull request #928 from utahkanz-ops/feat/878-unix-iso-conversion
davedumto May 31, 2026
9c344cf
Merge pull request #913 from promisszn/dev
davedumto May 31, 2026
43164b6
Merge pull request #931 from fortezzalaboratory/fix/routesf-random-na…
davedumto May 31, 2026
bf90f24
feat(routes-f): add polynomial evaluator using Horner's method (#868)
KevinMB0220 May 31, 2026
75662da
feat(routes-f): add IQR outlier detection (#872)
KevinMB0220 May 31, 2026
ceb77f0
feat(routesF): add reverse word order api (#904)
KevinMB0220 May 31, 2026
2037dd8
feat(routes-f): add binary-to-text converter and deep-merge objects
Just-Bamford Jun 2, 2026
520a1af
fixes issue 898
JSE19 Jun 2, 2026
54d8159
fixes issue 905
JSE19 Jun 2, 2026
37de3e6
fixes issue 855
JSE19 Jun 2, 2026
212ef51
fixes issue 890
JSE19 Jun 2, 2026
605e81d
Merge branch 'StreamFi-x:dev' into dev
JSE19 Jun 2, 2026
64ad0a5
Merge pull request #952 from Just-Bamford/feat/routes-f-binary-deepmerge
davedumto Jun 2, 2026
3c6cbea
feat(routes-f): add moon phase calculator
dmystical-coder Jun 2, 2026
db042c4
feat(routes-f): add recurring date series generator
dmystical-coder Jun 2, 2026
c2475b3
fix(routes-f): repair unix-date type error breaking type-check
dmystical-coder Jun 2, 2026
655cf9b
Merge pull request #956 from dmystical-coder/fix/unix-date-type-error
davedumto Jun 2, 2026
145240a
Merge pull request #955 from dmystical-coder/feat/788-recurring-dates
davedumto Jun 6, 2026
725fa93
Merge pull request #954 from dmystical-coder/feat/791-moon-phase
davedumto Jun 6, 2026
5fcf9e3
Merge pull request #951 from KevinMB0220/feat/routes-f-polynomial-eva…
davedumto Jun 6, 2026
f92440a
Merge pull request #953 from JSE19/dev
davedumto Jun 6, 2026
c87f891
Merge pull request #591 from T-kesh/dev
davedumto Jun 6, 2026
bbe9b5d
feat(routes-f): implement four stream-related api endpoints
anonfedora Jun 23, 2026
03e257e
feat: implement stream management features (tags, title, intermission…
0xdevmes Jun 23, 2026
e9d6d9c
Merge pull request #1060 from 0xdevmes/feat/stream-routes-f-features
davedumto Jun 23, 2026
bb23183
Merge pull request #1059 from anonfedora/feat/routes-f-stream-features
davedumto Jun 23, 2026
f01e602
feat(routes-f): add subscriptions, notification preferences, and welc…
theladyanina Jun 23, 2026
c6bcf92
Merge pull request #1061 from theladyanina/feat/routes-f-subscription…
davedumto Jun 23, 2026
a94c1ed
feat(routes-f): category switch, pinned msg, timeout, min tip
JamesVictor-O Jun 24, 2026
3b5a94a
feat: add chat features bundle - subscribers-only, slow mode, reactio…
Just-Bamford Jun 24, 2026
0cc4671
feat(routes-f): stream heartbeat, tip alert config, tip goal progress…
vic-Gray Jun 24, 2026
3644417
Merge pull request #1062 from codeX-james/codex/feat-981-971-966-964
davedumto Jun 24, 2026
89dedb5
feat(routes-f): explore feed, raid suggestions, notification preferen…
pre-cious-Igwealor Jun 24, 2026
7960582
feat(routes-f): add tips, subscription, and category feeds
testersweb0-bug Jun 24, 2026
e123899
Merge pull request #1067 from testersweb0-bug/feat/routes-f-subscript…
davedumto Jun 24, 2026
2e0de25
Merge pull request #1063 from Just-Bamford/feat/chat-features-bundle
davedumto Jun 24, 2026
5ecaacc
Merge pull request #1066 from pre-cious-Igwealor/feat/explore-feed-ra…
davedumto Jun 24, 2026
8039b85
feat(routes-f): subscription tier management
fortezzalaboratory Jun 25, 2026
54b4e65
feat(routes-f): creator subscriber roster
fortezzalaboratory Jun 25, 2026
a139881
feat(routes-f): anonymous tipping toggle
fortezzalaboratory Jun 25, 2026
b058871
feat(routes-f): emote-only chat mode
fortezzalaboratory Jun 25, 2026
711c6aa
Merge pull request #1068 from fortezzalaboratory/feat/routes-f-features
davedumto Jun 25, 2026
92a8b61
Merge pull request #1064 from vic-Gray/feat-959-979-977-972-routes-f-…
davedumto Jun 25, 2026
aa83f47
feat(routes-f): add mute/unmute creator route (#991)
aniokedianne Jun 25, 2026
a9b9dda
Merge pull request #1070 from aniokedianne/feat/issue-982-987-991-993
davedumto Jun 25, 2026
a6d0e23
feat(routes-f): most-liked clips, creator anniversary, VOD timestamp …
emdevelopa Jun 25, 2026
f41567c
Merge pull request #1071 from devpeter999/feat/routesF-issues
davedumto Jun 25, 2026
9315f25
feat(routes-f): viewer watch history endpoint with dedup
oomokaro1 Jun 25, 2026
2f5c92c
feat(routes-f): tip recap card endpoint
oomokaro1 Jun 25, 2026
7b28de3
feat(routes-f): viewer concurrent session count tracking
oomokaro1 Jun 25, 2026
66a7799
feat(routes-f): scheduled stream reminder signup
oomokaro1 Jun 25, 2026
e3f3390
Merge pull request #1072 from oomokaro1/feat/routes-f-watch-history-t…
davedumto Jun 25, 2026
9b58235
feat(routes-f): add clip auto-tag generator
DeFiVC Jun 25, 2026
d6cbb34
feat(routes-f): add VOD playlist for viewer
DeFiVC Jun 25, 2026
ab4ad97
feat(routes-f): add stream rerun loop
DeFiVC Jun 25, 2026
85b1c6b
feat(routes-f): add featured stream cover image
DeFiVC Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"permissions": {
"allow": [
"Bash(npm test *)"
]
}
}
46 changes: 46 additions & 0 deletions .github/workflows/block-main-prs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Block PRs targeting main

on:
pull_request_target:
types: [opened, reopened]
branches: [main]

permissions:
pull-requests: write

jobs:
block:
runs-on: ubuntu-latest
if: github.event.pull_request.user.login != 'davedumto'
steps:
- name: Comment and close PR
uses: actions/github-script@v7
with:
script: |
const pr = context.payload.pull_request;
const message = [
`Hi @${pr.user.login} — thanks for the contribution!`,
``,
`This repo uses \`dev\` as the integration branch. PRs targeting \`main\` are not accepted.`,
``,
`Please re-open this PR against \`dev\` instead. From your branch:`,
``,
`1. Click **Edit** on this PR title area`,
`2. Change the base branch from \`main\` to \`dev\``,
``,
`Or open a fresh PR from the GitHub UI with \`dev\` selected as the base.`,
].join('\n');

await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
body: message,
});

await github.rest.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number,
state: 'closed',
});
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,6 @@ package-lock.json
dev
bun.*
bun.lock
fix.md
issue.md
pr.md
3 changes: 3 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,6 @@ pnpm-lock.yaml
# Generated files
*.min.js
*.min.css

# TypeScript cache
*.tsbuildinfo
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"kiroAgent.configureMCP": "Disabled"
}
68 changes: 37 additions & 31 deletions app/[username]/watch/page.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
"use client";

import { use, useEffect, useState, useRef } from "react";
import { notFound, useSearchParams } from "next/navigation";
import { use, useCallback, useEffect, useState, useRef } from "react";
import { notFound } from "next/navigation";
import ViewStream from "@/components/stream/view-stream";
import { ViewStreamSkeleton } from "@/components/skeletons/ViewStreamSkeleton";
import AccessGate from "@/components/stream/AccessGate";
import { toast } from "sonner";
import PrivateStreamGate from "@/components/stream/private-stream-gate";
import { useStellarWallet } from "@/contexts/stellar-wallet-context";

interface PageProps {
params: Promise<{ username: string }>;
Expand All @@ -24,26 +25,27 @@ interface UserData {
follower_count: number;
is_following: boolean;
stellar_address: string | null;
is_password_protected: boolean;
stream_access_type: "public" | "password" | "subscription" | null;
subscription_price_usdc: number | null;
latency_mode: string | null;
stream_privacy: string | null;
}

interface AccessInfo {
allowed: boolean;
reason: string | null;
}

const WatchPage = ({ params }: PageProps) => {
const { username } = use(params);
const searchParams = useSearchParams();
const shareKey = searchParams?.get("key") ?? null;
const { publicKey, privyWallet } = useStellarWallet();
const viewerPublicKey = publicKey || privyWallet?.wallet || null;
const [userData, setUserData] = useState<UserData | null>(null);
const [access, setAccess] = useState<AccessInfo | null>(null);
const [loading, setLoading] = useState(true);
const [notFound404, setNotFound404] = useState(false);
const [isFollowing, setIsFollowing] = useState(false);
const [followLoading, setFollowLoading] = useState(false);
const [loggedInUsername, setLoggedInUsername] = useState<string | null>(null);
const [accessGranted, setAccessGranted] = useState(false);

const handleAccessGranted = useCallback(() => {
setAccessGranted(true);
}, []);

// Viewer tracking: one unique ID per page visit
const viewerSessionId = useRef<string | null>(null);
Expand All @@ -64,15 +66,10 @@ const WatchPage = ({ params }: PageProps) => {
setLoading(true);
}

const qs = new URLSearchParams();
if (loggedInUsername) {
qs.set("viewer_username", loggedInUsername);
}
if (shareKey) {
qs.set("key", shareKey);
}
qs.set("t", String(Date.now()));
const response = await fetch(`/api/users/${username}?${qs.toString()}`);
const viewerParam = loggedInUsername
? `?viewer_username=${encodeURIComponent(loggedInUsername)}&t=${Date.now()}`
: `?t=${Date.now()}`;
const response = await fetch(`/api/users/${username}${viewerParam}`);

if (response.status === 404) {
setNotFound404(true);
Expand All @@ -88,7 +85,6 @@ const WatchPage = ({ params }: PageProps) => {

const data = await response.json();
setUserData(data.user);
setAccess(data.access ?? { allowed: true, reason: null });
setIsFollowing(!!data.user.is_following);
} catch (error) {
console.error("Failed to fetch user data:", error);
Expand All @@ -106,7 +102,7 @@ const WatchPage = ({ params }: PageProps) => {
fetchUserData();
const interval = setInterval(fetchUserData, 5000);
return () => clearInterval(interval);
}, [username, loggedInUsername, shareKey]);
}, [username, loggedInUsername]);

// Register viewer once when stream goes live; guard against re-registration on every poll
useEffect(() => {
Expand Down Expand Up @@ -220,14 +216,26 @@ const WatchPage = ({ params }: PageProps) => {

const isOwner = loggedInUsername?.toLowerCase() === username.toLowerCase();

// Private stream + viewer not authorized: show gate instead of player
if (access && !access.allowed && !isOwner) {
// Show access gate if stream is password protected and viewer isn't the owner
const needsPassword =
userData.is_password_protected &&
userData.stream_access_type !== "subscription" &&
!isOwner &&
!accessGranted;
const needsSubscription =
userData.stream_access_type === "subscription" &&
!isOwner &&
!accessGranted;

if ((needsPassword || needsSubscription) && userData.mux_playback_id) {
return (
<PrivateStreamGate
<AccessGate
playbackId={userData.mux_playback_id}
username={username}
privacy={(userData.stream_privacy as any) || "unlisted"}
reason={access.reason}
avatar={userData.avatar}
onAccessGranted={handleAccessGranted}
accessType={needsSubscription ? "subscription" : "password"}
monthlyPrice={userData.subscription_price_usdc}
viewerPublicKey={viewerPublicKey}
/>
);
}
Expand All @@ -247,8 +255,6 @@ const WatchPage = ({ params }: PageProps) => {
playbackId: userData.mux_playback_id,
latencyMode: userData.latency_mode || "low",
isLive: userData.is_live,
privacy: userData.stream_privacy || "public",
shareKey: shareKey,
};

return (
Expand Down
82 changes: 82 additions & 0 deletions app/api/admin/feature-flags/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import { NextRequest, NextResponse } from "next/server";
import { sql } from "@vercel/postgres";
import { verifySession } from "@/lib/auth/verify-session";
import { isAdmin } from "@/lib/admin-auth";

/**
* Admin-only CRUD for feature flags.
*
* GET /api/admin/feature-flags – list all flags
* POST /api/admin/feature-flags – create a flag
* PATCH /api/admin/feature-flags – update a flag (body: { key, ...fields })
* DELETE /api/admin/feature-flags?key=xxx – delete a flag
*/

async function guardAdmin(req: NextRequest) {
const session = await verifySession(req);
if (!session.ok) return { ok: false as const, response: session.response };
if (!isAdmin(session.userId)) {
return {
ok: false as const,
response: NextResponse.json({ error: "Forbidden" }, { status: 403 }),
};
}
return { ok: true as const };
}

export async function GET(req: NextRequest) {
const guard = await guardAdmin(req);
if (!guard.ok) return guard.response;

const { rows } = await sql`SELECT * FROM feature_flags ORDER BY key`;
return NextResponse.json({ flags: rows });
}

export async function POST(req: NextRequest) {
const guard = await guardAdmin(req);
if (!guard.ok) return guard.response;

const { key, description, enabled = false, rollout_percentage = 0, allowed_user_ids = [] } = await req.json();
if (!key) return NextResponse.json({ error: "key is required" }, { status: 400 });

const { rows } = await sql`
INSERT INTO feature_flags (key, description, enabled, rollout_percentage, allowed_user_ids)
VALUES (${key}, ${description ?? null}, ${enabled}, ${rollout_percentage}, ${allowed_user_ids})
ON CONFLICT (key) DO NOTHING
RETURNING *
`;
if (!rows.length) return NextResponse.json({ error: "Flag already exists" }, { status: 409 });
return NextResponse.json({ flag: rows[0] }, { status: 201 });
}

export async function PATCH(req: NextRequest) {
const guard = await guardAdmin(req);
if (!guard.ok) return guard.response;

const { key, enabled, rollout_percentage, allowed_user_ids, description } = await req.json();
if (!key) return NextResponse.json({ error: "key is required" }, { status: 400 });

const { rows } = await sql`
UPDATE feature_flags SET
enabled = COALESCE(${enabled ?? null}, enabled),
rollout_percentage = COALESCE(${rollout_percentage ?? null}, rollout_percentage),
allowed_user_ids = COALESCE(${allowed_user_ids ?? null}, allowed_user_ids),
description = COALESCE(${description ?? null}, description),
updated_at = CURRENT_TIMESTAMP
WHERE key = ${key}
RETURNING *
`;
if (!rows.length) return NextResponse.json({ error: "Flag not found" }, { status: 404 });
return NextResponse.json({ flag: rows[0] });
}

export async function DELETE(req: NextRequest) {
const guard = await guardAdmin(req);
if (!guard.ok) return guard.response;

const key = new URL(req.url).searchParams.get("key");
if (!key) return NextResponse.json({ error: "key is required" }, { status: 400 });

await sql`DELETE FROM feature_flags WHERE key = ${key}`;
return NextResponse.json({ ok: true });
}
20 changes: 19 additions & 1 deletion app/api/auth/session/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { PrivyClient } from "@privy-io/server-auth";
import { sql } from "@vercel/postgres";
import { createRateLimiter } from "@/lib/rate-limit";
import { getRandomProfileIcon } from "@/lib/profile-icons";
import { createSession } from "@/lib/sessions/user-sessions";

// 10 Privy session exchanges per IP per 60 s
const isRateLimited = createRateLimiter(60_000, 10);
Expand Down Expand Up @@ -131,8 +132,10 @@ export async function POST(req: NextRequest) {
// We store the privy_id (opaque, server-verified) — never the raw JWT
const isProduction = process.env.NODE_ENV === "production";
const cookieMaxAge = 24 * 60 * 60; // 24 h in seconds
// The raw token for a Privy session is the privy_id itself
const rawToken = privyUserId;
const cookieValue = [
`privy_session=${privyUserId}`,
`privy_session=${rawToken}`,
`Path=/`,
`Max-Age=${cookieMaxAge}`,
`HttpOnly`,
Expand All @@ -157,6 +160,21 @@ export async function POST(req: NextRequest) {
});

res.headers.set("Set-Cookie", cookieValue);

// Record the session in user_sessions (fire-and-forget — don't block the response)
createSession({
userId: dbUser.id,
rawToken,
ipAddress:
req.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ??
req.headers.get("x-real-ip") ??
null,
userAgent: req.headers.get("user-agent") ?? null,
ttlSeconds: cookieMaxAge,
}).catch((err) =>
console.error("[session] Failed to record user_session row:", err)
);

return res;
} catch (err) {
console.error("[session] DB error:", err);
Expand Down
15 changes: 15 additions & 0 deletions app/api/auth/wallet-session/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { NextRequest, NextResponse } from "next/server";
import { sql } from "@vercel/postgres";
import { signToken } from "@/lib/auth/sign-token";
import { createRateLimiter } from "@/lib/rate-limit";
import { createSession } from "@/lib/sessions/user-sessions";

const isRateLimited = createRateLimiter(60_000, 20); // 20 requests/min per IP

Expand Down Expand Up @@ -89,6 +90,20 @@ export async function POST(req: NextRequest) {

const res = NextResponse.json({ ok: true });
res.headers.set("Set-Cookie", cookieValue);

// Record the session in user_sessions (fire-and-forget)
// getIp() may return "unknown" — normalise to null so the INET cast doesn't fail
const rawIp = getIp(req);
createSession({
userId: u.id,
rawToken: token,
ipAddress: rawIp === "unknown" ? null : rawIp,
userAgent: req.headers.get("user-agent") ?? null,
ttlSeconds: COOKIE_MAX_AGE,
}).catch((err) =>
console.error("[wallet-session] Failed to record user_session row:", err)
);

return res;
} catch (err) {
console.error("[wallet-session] DB error:", err);
Expand Down
Loading
Loading