#👾-core-development
1 messages · Page 273 of 1
6e16acb Add prototype pollution protection and security... - Copilot
1c354b9 Update security documentation with safer hasOwn... - Copilot
5325dab Add comprehensive security audit summary docume... - Copilot
the prototype pollution aspect it brought up is actually true
settings sync is indeed vulnerable to it
it's not really a bad vulnerability (since I doubt it can be exploited in a meaningful way, plus the attacker needs to have access to your vencloud safe aka have access to your discord account or be us) but should still be fixed

yeah its good it noted it but there's no meaningful vuln here
I have created a plugin that lets you set an expiration time for your messages. It supports exclusions for DMs (all), channel ids, guild ids. It has different options such as editing the message before deleting, getting notified for messages that have been deleted, forceful cleanup of message queue.
It also has handy slash commands that let you add exclusion directly from the channel/guild you are in.
When this plugin is toggled or the user forcefully flushes the message queue, it may m...
<img width="1256" height="308" alt="image" src="https://github.com/user-attachments/assets/6c78b196-b43d-4336-b653-af6c44d8450b" />
:thinking:
Do let me know if you think such plugin can be implemented (especially with proper rate limiting). My ideal scenario is that in the end, you would have some counter in the UI that tells you something like "Messages waiting to expire: x" and when you disable the script/forcefully delete everything, it would batch it in groups of 10-20. :+1:
isTryItOutFlow -> isTryItOut is the only difference I saw and its not stable compat because of it
if u wanna make it stable compat why dont just pick another part of the code 
isTryItOut is used in the modal
its a findbycode not a findbyprops
as long as it matches the code it wouldnt matter if isTryItOut specifically is used in the match
thats all i said 
it doesnt need to be stable compat anyway its just a plugin
what I mean 
or are you saying have both?
techncially possible but thats so stupid for a plugin
.*$ doesn't really make much sense, at that point you could just drop all of it including the $.
Need to also update workflows https://github.com/Vendicated/Vencord/blob/main/.github/workflows/build.yml#L50-L56
and maybe more places where it uses the git hash
do you just want me to leave this slice as is?
also wym more places that use git hash? all I see thats using it right now is
HashLink (img above)
Updater both for fetching/checking for updates and calculating changes
SupportHelper for the full commit link
Ports most of Vencord/Vesktop#1198 into a plugin.
The native Wayland module still remains in the original Vesktop PR due to Vencord apparently not being able to load native node modules, so if this is merged the old PR needs a quick tidyup to remove its old implementation and instead just add the wayland-protocols package to enable Wayland compatibility.
Still mostly untested, even more so since it's been ported. Tested on NixOS 25.11 unstable with hyprland 0.51.1.
0f25873 ReplaceGoogleSearch: add option to replace engi... - norowachi
cf8db5d Merge remote-tracking branch 'origin/main' into... - Vendicated
b6d7276 CustomRPC: add detail/state and image URL field... - hich4t
3992f97 fix missing Toolbox - Vendicated
44a75e4 fix Decor & NoTrack (#3752) - thororen1234
1 week later and I have no idea what UI breaking things nino is referring to in known issues
I told you he's insane
I think he was just referring to how the toolbox and stuff was broken for some people
Idk he is insane
There is also desktop-land-and-learn breaking pin DMs
But thats a small number of people who have that
I'd love to have this plugin added !! It's a much needed feature for a lot of us.
c9ebece FakeProfileThemes: Fix broken ProfileModal find... - thororen1234
vtest
Now testing! 
TypingTweaks (took 7.1ms):
ID: 738619
Match: ```
/(?<="aria-atomic":!0,children:)\i/
findComponentByCode("isTryItOut:", "pendingThemeColors:", "pendingAvatarDecoration:", "EDIT_PROFILE_BANNER")
Seems like everything is working fine (for now) 
The Vencord Chrome Extension is up to date! (v1.13.4)
no tag pushed
oop
this doesn't actually do what it claims to do
I don't like this, bad user experience. We should just add a safe mode
also marking settings as dirty (i.e. syncing to cloud) makes it even worse because this is definitely not what the user wants
this shouldn't be here, it should be in the same place as the git hash
I really don't like all this essentially duplicated from Vencord code, it hurts maintainability drastically. These should be in Vencord's source and exported on Vencord's global object
don't do this cursed map
also since you deleted the firefox specific manifest, the background script is now completely unused and firefox has no csp bypass anymore
why does this use chrome instead of the api variable?
vtest dev
Now testing! 
Other than that very cute idea and ui!
findComponentByCode("isTryItOut:", "pendingThemeColors:", "pendingAvatarDecoration:", "EDIT_PROFILE_BANNER")
Seems like everything is working fine (for now) 
Instead of the class, you could even do this to do it automatically:
.button-grid {
display: grid;
gap: 1em;
grid-template-columns: repeat(2, 1fr);
> :last-child:nth-child(odd) {
grid-column: 1 / -1;
}
}
because it's vibecoded
As this is substitution we need to drop the "/u" in the link, this was accomplished through the ., granted the $ is not necessary . should suffice. https://tidal.com/track/68689136/u -> tidal://track/68689136 and not tidal://track/68689136/u
Plugin: BulkChannelDelete
Adds bulk channel selection and deletion for Discord servers.
- Supports Shift + Right Click multi-selection
- Optional bot-token method for safe operation
- Configurable delay and export options
- Clean UI integration with Vencord's plugin panel
Pretty sure using a bot token in a client is just as frowned upon as self botting

never

v3 is my magnum opus
v3.1 
tbh i kinda remember why i did it like that but its no longer necessary
especially since i can just set the loadedLocale to default to english, so there's always a loaded bundle
i should actually look at that review
@austere talon how should that safe mode be triggered on web?
and what if Settings explodes
discord will still explode yk
can settings explode?
isnt it just using local storage
the patches
Adds bulk channel selection and deletion for Discord servers.
- Supports Shift + Right Click multi-selection
- Optional bot-token method for safe operation
- Configurable delay and export options
- Clean UI integration with Vencord's plugin panel
bro just opened it again
This plugin violates the plugin rules (API spam) and was closed previously, avoid doing this.
Is it me or do I just not trust anything that has the commit name “Add files via upload” in it
vibe coded
they don’t know how to use git so they probably made with ChatGpt and uploaded
/**
- Vencord Plugin: Bulk Channel Delete
- @name BulkChannelDelete
- @description Multi-select and delete multiple Discord channels at once with Shift + Right Click
- @author YourName
- @version 1.0.1
- ⚠️ WARNING: This plugin can permanently delete channels. Use with extreme caution!
-
- Deleted channels CANNOT be recovered
-
- This may violate Discord's Terms of Service
-
- Use only in servers where you have proper authorization
-
- The author is not responsible for any consequences of using this plugin
*/
- The author is not responsible for any consequences of using this plugin
okay this is vibe coded
thanks YourName for making this awesome plugin
BetterDcord saying hello lmao
i remember having to write that header
mmmm sweet sweet raw dom manipulation
we love discords ui choices
I think the adblock plugin is causing some issues, it seems to spam some sort of module crash log in the native console when you play a video and each time you click another youtube embed the log gets longer and longer and discord gets more and more laggy
It seems like the log contains the other logs as it gets ridiculously more escaped lol
they didn't even remove the comments before functions
it just crashed my discord lmfao
like 8 clicks and it died
Yeah it stacks fast lol, the logs look ridiculous at that point, just a screen full of backslashes
my discord wont even open now
voice just went missing
then it crashed
instantly 3gb used again
not even loading anything
A full restart sorts it for me
it fully dies and then reopening it does 4gb off the bat
can you provide a video of the repro + relevant logs*
cc @gritty iris
yup give me a sec gotta close my kubernetes stuff
the 3gb is from doing it before
where's that hiddenCSS one coming from?
i tried looking for it but cant find a ref to it in (at least my) client source
you gonna give me a moment it unpatched after that crash lol
adguard
Same, I was gonna show the logs freaking out but it has my email and stuff in it so eh
hmm i kinda knew this much, but im trying to work out whats specifically saying hiddenCSS has already been declared since it should be scoped
unless it is that
Yeah I clicked the console error to jump to that
hm okay
so that snippet probably has stopped working then
since its constantly rerunning in the iframe context
Microplastics are accumulating in human brains at an alarming rate
https://www.youtube.com/watch?v=0PT5c1z3LL8
“Nanoplastics and Human Health” with Matthew J Campen, PhD, MSPH
https://www.youtube.com/watch?v=RRBN_4L09Mg
00:00 Intro
00:05 The cool thing
00:17 End
CR: hiddenCSS redefinition issue, not the loop though
latest canary
did I just dox myself? 😭
fwiw from what i can see no lol
Sent
I don't think that recording had my email anyway, must've been an earlier one but better safe than sorry
i have no interest in leaking ur info so ur secrets r safe with me
agh that is a very deeply nested json structure
hm interesting ok so it seems to eventually play the video
Yeah I think each log is containing the previous one as a string
yeah it seems to
The videos play, it just gets slower and slower
can you check the dir it references, %appdata%/discordptb/module_data/crashlogs
you are right though it is def logging the prev one in the object
idk if im chasing a dead end but its worth trying to investigate anything in there
Just log files with the same content as the console
The last one before it causes a crash is 121mb lol
fwiw it's logged as a sentry report, shouldn't that be disabled?
Or is it just the part that actually sends it to discord
the sending is disabled
it can still make reports but they wont be sent to discord cuz the sentry reporter is dead
Makes sense
we should probs disable that in the plugin though, @limber skiff ^
The json is just a list of the console lines from the session as well so just nothing interesting at all really
yeah its nothing more than you'd get from devtools
that kinda sucks, i was hoping for an easy "oh its that" fix
doesnt help that i cant repro the issue
the yt adblock plugin is repeatedly crashing in the iframe and it's causing sentry to keep trying to report the logs in console, so it keeps including its own previous report and inflating the log each time
😭
from what i can see, the ytab plugin reinjects itself multiple times and leaks a ton of memory
but only in some users
on my client, it reinjects once sure but doesnt seem to cause a memleak
idk if this is an a/b from youtube or not
Adds protexBlocks plugin for integration with the Protex moderation bot API.
The plugin automatically checks users against the API to detect blocked users.
-# No API Key is required
what is protex
well..
No untrusted third party APIs. Popular services like Google or GitHub are fine, but absolutely no self hosted ones
ProteX is an advanced moderation bot focused on security, automation and community protection.
all the commit does is blocks users from using vencord if they're blocked from using the protex bot
i presume
a plugin for a bot wouldve been rejected anyway
ikr
this plugin is just a bit silly for what it is
more suitable as a third party one
i just dont understand why vencord would need it
looks like it just hides messages client side if they're blocked with the bot
oh wtf
i dont care enough to find out lol
neither
disk leak
Adds protexBlocks plugin for integration with the Protex moderation bot API.
The plugin automatically checks users against the API to detect blocked users.
This is an updated version that pulls from GitHub and not our API - I hope I understood correctly what lewisakura meant by a services like GitHub😭
@turbid hatch theyre back 😭
ty
that bug has been annoying me for longer than it should have been
(i should have fixed it a lot eariler)
@limber skiff got a question for you
so for that pr for whatever reason arguments[0] is always undefined when hovering in chat
but using the avatar decoration override value that was there blocks decor?
also apperantly the create modal is fucked
fix was avatarDecorationOverride -> avatarDecoration
added a fix for decor not applying in select/create modal
Just tested the plugin with https://github.com/Vencord/Vesktop/pull/1198, on Plasma Wayland once again. Still works a charm. Nice work!
@Vendicated pls some kind of communcation it hasn't even been added to the projects tab
This apperantly always shows the decor in the shop so I'll need to fix that
yop fix also stable compat yay or nay?
db5e507 fix NoBlockedMessages - Vendicated
e9fd7db GameActivityToggle: fix panel overflow - Vendicated
ebe2b27 BetterSettings: remove duplicate "Other options... - EepyElvyra
556a277 ExpressionCloner: fix crash when in a server wi... - Vendicated
0f25873 ReplaceGoogleSearch: add option to replace engi... - norowachi
vtest fix-circular-deps
Now testing! 
Now testing! 
web only issue
vtest fix-circular-deps
Now testing! 
Seems like everything is working fine (for now) 
Seems like everything is working fine (for now) 
ts pmo
@limber skiff review https://github.com/Vendicated/Vencord/pull/3729/
so we can merge
556a277 ExpressionCloner: fix crash when in a server wi... - Vendicated
0f25873 ReplaceGoogleSearch: add option to replace engi... - norowachi
6f16f13 fix(openInApp): Tidal regex (#3747) - Aztup
cf8db5d Merge remote-tracking branch 'origin/main' into... - Vendicated
b6d7276 CustomRPC: add detail/state and image URL field... - hich4t
alright
Thank you for your contribution! Unfortunately this can in no way be merged because it has native binaries which
- I cannot trust to be safe
- The way they are included as base64 then written to a file is just way too cursed
Plus this plugin seems niche!
Sorry :(
@Vendicated Thanks for the response. Appreciate it.
I agree with all of your points. Honestly, I didn't have high expectations on this to be merged. What's more, if I were you, I would not approve this as well.
Hopefully someone might find the plugin useful someday and despite all precautions not to grab random binary from a random dude on the web would still compile the thing.
Anyway, it was a nice experience writing a plugin for your this project. I really enjoyed it. It is amazing...
PR obituary
theres r the responses we need
wait its broken on stable?
tmk its been broken since they changed the last patch
I'm asking if it's compatible or not
should be I didnt see any changes
idrk how Im gonna fix the store being broken
any ideas?
they're using the override in chat and such is the issue :(
It's Showtime!
im really sorry i thought i was working in my own fork i dont know how this happened mb gang please ignore
Insane
who
I made some changes to remove the logging statements that weren't previously part of the plugins, and to move the CSP editing from the main CSP file into the plugin itself so that users who aren't opted-in to using the plugin don't have any modifications to their CSP. I also added additional checks to ensure the plugin doesnt have null dereferences or array out of bounds accesses done within the frame javascript context.
insane 😭

horrorrrrr
this is the terrible fix I have for it wiping the shop decors for custom decors 😭
apperantly its broken in the actual decor thing as well 
@austere talon hi
good music
portuguese is hypnotizing
I have been only listening to portuguese songs recently
this one really is a banger
not quite
im spanish
brazilian but with typos
I know a bit of spanish
thank you keys thank you
(chatbarbuttons)
i think youre really close you just need to check for decor page and shop pages
i would say
check modal stack?
vtest fix-circular-deps
Now testing! 
Seems like everything is working fine (for now) 
ChatInputButtonAPI (had no effect):
ID: 258696
Match: ```
/return(\i.\i||(?=(.+?(\i).push)/
it seems to me that if you are overriding decorations in the shop too, then you are overriding one component too deep
instead target which place that access the user current decoration and passes it down to avatarDecorationOverride
I just ended up patching messages separately
huh
the module its patching is kinda like the center and expanded upon
so I just patched messages instead
that's what I said
oh
im losing it 
its not a very good patch ngl
// Messages
{
find: '"Message Username"',
replacement: [
{
match: /(?<=void 0:)((\i)\.avatarDecoration)/,
replace: "$self.useUserDecorAvatarDecoration($3)??$2"
}
]
}
you were patching UserWithAvatarDecoration and not the component that had <UserWithAvatarDecoration decoration={...}>
for example
well keeping the old patch does member list and such still
so I was just gonna keep that and patch messages separately
and how does it not affect the shop too?
should I add an anchor to this?
ill just add uservalue to use as an anchor
I just pushed it to the pr
Content
[Feature Request] Enable Developer Tools via Ctrl+Shift+I (Console Access)
Description
I’d like to request the ability to open Developer Tools (the console) directly within Vencord, similar to how it works in Discord Web.
Currently, I’ve tried several approaches to enable it, including:
- Using
Ctrl+Shift+I - Setting
"DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING": true
…but none of these methods seem to allow access to the console.
Why This W...
Love feature requests for things that already exist
this is already a feature, use our support channel to get support
Opening devtools with f12 would be nice though
sure
They added keys so if the key is null its ignored
I just did -1 so they stayed the same as before 
also that fix looks eh I wanted input so I opened it
WE GOT A KEY
I don't like this implementation, we should just push into the children
vtest dev
Now testing! 
Seems like everything is working fine (for now) 
Seems like everything is working fine (for now) 
test
@fossil inlet satan
Why husk
LOVE
Good feature tho
And it's not slop if it can animate and doesn't get animated by always animate
Simpleee
I should make vencord companion mcp server
I always read mcp server as Minecraft pocket edition server
Finally be able to vibecode patches
Imsane
That's mcpe
mcpedl my beloved
mcpe server
:(
minecraft still refers to bedrock as pe internally lol
quickest ss I have
why r u talking about mc
Why aren't you?
cuz idk why I need to
great more aislop
funnily enough they all have i18n
Discord ignores them in the typing indicator below the chat box so this adds parity between the two. Still able to be shown through the includeBlockedUsers setting.
do Devilbro plugins have i18n
dont think so
yes they do
okay that’s why
already a thing in voicechatUtilites #1260497802019082251
also why

the Vencord Contributor/Donor badges currently seem to be broken:
this pr fixes that, restoring the badges:
additionally, the IrcColors plugin wasn't coloring in the member list of group DMs when set to Only Apply Color In Dms, which this pr also fixes
its me
avoid adding yourself to devs for very minor changes like this
fb3d927 fix Badges not showing; fix IrcColors in group ... - alfuwu
Thank you for the fixes! ❤️
For future reference, avoid sending pull requests from the main branch. Instead, always use feature branches. This is better for both you and us
vtest
Now testing! 
RoleColorEverywhere (had no effect):
ID: 6839
Match: ```
/,onContextMenu:\i=>.{0,15}((\i),(\i),(\i)).{0,250}tag:"strong"/
RoleColorEverywhere (had no effect):
ID: 6839
Match: ```
/,onContextMenu:\i=>.{0,15}((\i),(\i),(\i)).{0,250}tag:"strong"/
vtest
Now testing! 
Seems like everything is working fine (for now) 
PermissionFreeWill (took 5.8ms):
ID: 156699
Match: ```
/{(?:\i:()=>\i,?){2}}/
https://github.com/Vendicated/Vencord/pull/3781/files#diff-e8d0a358ae2fb090c56f00a058050983cc9691b7d3622ddd443170017123e7d9
forgot to remove their name from constants.ts
thats fine it can be removed in a different commit
it'll just get compiled out since its unused
or, well, should
dunno if its smart enough for that
hm?
@austere talon why is this needed?
wdym
I meant like
can we not import patches from here already
or does the autosort imports mess it up
because then it gets moved to the bottom
yes
ugh annoying
this is too funny

this line is so important lmfao
this one is so funny
browser imported utils/discord before importing vencord entry point
which imports like half of the entire mod

but then isn't the one in the bottom enough?
wdym
I removed the one in the top
we want patchWebpack to be loaded first
is the one in the bottom enough or will it cause issues
ah, I think I misunderstood what you said with priority
well technically we don't need the patchWebpack import
trhe plugin import already imports it
wait does it
yeah it does
it can go i think
yeah you are right
vtest fix-circular-deps
Now testing! 
Seems like everything is working fine (for now) 
BetterSettings (took 5.1ms):
ID: 720734
Match: ```
/(\i)(this,"handleOpenSettingsContextMenu",.{0,100}?null!=\i&&.{0,100}?(await [^};]?))).?,(?=\1(this)/
wait we dont need the inline import in VencordNative i think
vtest fix-circular-deps
Now testing! 
should we have something like hasPluginStarted?
to avoid this for example
your commit conflicts 
what's wrong with this
I don't like passing plugin names as strings
it hurts maintainability
couldn't it at some point cause a circular dependency
it could yes but it's easy to avoid & fix
alright
even this i dont like
ideally it should be something like OpenInAppPlugin.enabled?
I see
importing plugins is fine it should never cause any issues
the way circular import issues happen is if two files have top level code that depends on each other
did you test anything here?
for plugins importing each other or themselves to cause issues, they would both have to have top level code that uses each other
we should just avoid top level code as much as we can
is discord having issues
github webhook didnt send the commit and my messages are lagging
vds
🟢 API: Operational
🟢 Media Proxy: Operational
🟢 Gateway: Operational
🟢 Push Notifications: Operational
🟢 Search: Operational
🟢 Voice: Operational
Latest Outage Information
Incident: 🟠 API Availability Issues
Status: 🔴 Investigating
Identified At: N/A
Last Updated: <t:1763214170:F>

quickcss indirectly imports most of vencord
it shouldnt matter but eh
I'm not sure if it still causes issues but
it seems risky to keep it
since it indirectly requires all webpack commons which is kinda risky
ill keep it as is right now
webpack commons should avoid importing each other
Now testing! 
Seems like everything is working fine (for now) 
Seems like everything is working fine (for now) 
trailing in the beginning 
SDGFAHFDJSFADS
was this on purpose
oh yeah
we nuked that plugin didn't we
yeah its gone lmao
ugh I formatted the file in accident
ehh It's fine, right?
now eslint is yapping
undo formatting 
@austere talon this is dumb, any idea how to fix this?
lmaoooo
you'd have to just eslint-ignore it
why the fuck does it want this
there has to be a configuration for this
but the solution is so bad lmao
just dont add plugins import alias 
also imo this is fine
makes it clearer where it's coming from
fwiw this is intended behavior by the eslint plugin
one of their examples shows it
I mean
you're meant to use the full alias no matter what (except in our case for ./)
I just dont understand why it wants to nest it so much
if our relative import is much more closer and short
refactoring mostly
the whole point is that if you were to change where the file was it would still import fine
otherwise you'd have to update your relative imports
windows issue
its using the environment path sep 
i think if you use the eslint cli it doesnt do that
HORROR
stupid clankers
I did, same issue
eslint is dumb then
it shouldnt be using the env sep when / is the only valid char for node lol
the issue isn't eslint it's that plugin
maybe this is better but it hasnt been updated in 7y https://www.npmjs.com/package/eslint-plugin-import-alias
seems like https://www.npmjs.com/package/eslint-import-resolver-alias is much more popular
xD
wait how the fuck
I ran the lint command and it said everything was fine
so stupid
well it Runs As Eslint so its Eslint's Fault
/s
vtest fix-circular-deps
Now testing! 
evil pr
Seems like everything is working fine (for now) 
Seems like everything is working fine (for now) 
alright looks good to me
Now testing! 
Seems like everything is working fine (for now) 
Seems like everything is working fine (for now) 
bro didnt check what @api/Settings imports
dont tell me
settings api imports half of vencord
oh my god
just undo that commit 
💔
useless
vencord is.. spaghetti code??
we need to add custom instructions
if we're gonna keep using that hunk of junk
cuz as a pr reviewer its practically pointless
Now testing! 
Seems like everything is working fine (for now) 
ShowHiddenChannels (took 6.2ms):
ID: 473403
Match: ```
/(?<=.LOCKED;if()(?<={channel:(\i).+?)/
dude i cant wait
until i get more nvmes
i can finally move my data drive off of spinning rust
i give up i've tried two tools to generate a depgraph
and neither of them want to play nice with codebase
madge doesnt support path aliases, and dependency-cruiser seems to get caught up on the two .js files we have and assumes that the whole codebase is js only
i think im going to do more refactoring in this pr @limber skiff
like make settings not import other places
and move quickcss to api
etc
we can't really do this
it needs all plugins and react for hooks
we could solve it by spamming lazy imports but meh
Content
Title.
That's all. It's annoying, not needed. Marks valid code as a spelling error.
Request Agreement
- [x] I have read the requirements for opening an issue above
stylelint in quickcss when
That's just monaco not being up to date, isn't it?
Just like back when :has() selectors weren't properly recognised
@limber skiff why doesn't findStore early return?
export function findStore(name: StoreNameFilter) {
let res = fluxStores[name] as any;
if (res == null) {
for (const store of Flux.Store.getAll?.() ?? []) {
const storeName = store.getName();
if (storeName === name) {
res = store;
}
if (fluxStores[storeName] == null) {
fluxStores[storeName] = store;
}
}
try {
const getLibdiscore = findByCode("libdiscoreWasm is not initialized");
const libdiscoreExports = getLibdiscore();
for (const libdiscoreExportName in libdiscoreExports) {
if (!libdiscoreExportName.endsWith("Store")) {
continue;
}
const storeName = libdiscoreExportName;
const store = libdiscoreExports[storeName];
if (storeName === name) {
res = store;
}
if (fluxStores[storeName] == null) {
fluxStores[storeName] = store;
}
}
} catch { }
if (res == null) {
res = find(filters.byStoreName(name), { isIndirect: true });
}
}
if (!res)
handleModuleNotFound("findStore", name);
return res;
}
there are multiple places where it could early return
old code I think
export function findStore(name: StoreNameFilter) {
let res = fluxStores[name] as any;
if (res) return res;
for (const store of Flux.Store.getAll?.() ?? []) {
const storeName = store.getName();
if (storeName === name) {
fluxStores[storeName] = store;
return store;
}
}
try {
const getLibdiscore = findByCode("libdiscoreWasm is not initialized");
const libdiscoreExports = getLibdiscore();
for (const libdiscoreExportName in libdiscoreExports) {
if (!libdiscoreExportName.endsWith("Store")) {
continue;
}
const storeName = libdiscoreExportName;
const store = libdiscoreExports[storeName];
if (storeName === name) {
fluxStores[storeName] = store;
return store;
}
}
} catch { }
res = find(filters.byStoreName(name), { isIndirect: true });
if (res) {
fluxStores[name] = res;
return res;
}
handleModuleNotFound("findStore", name);
return null;
}
isn't this better
also that should use Map not object
export function findStore(name: StoreNameFilter) {
let res = fluxStores.get(name);
if (res) return res;
for (const store of Flux.Store.getAll?.() ?? []) {
if (name === store.getName()) {
fluxStores.set(name, store);
return store;
}
}
try {
const getLibdiscore = findByCode("libdiscoreWasm is not initialized");
const libdiscoreExports = getLibdiscore();
for (const libdiscoreExportName in libdiscoreExports) {
if (!libdiscoreExportName.endsWith("Store")) {
continue;
}
const storeName = libdiscoreExportName;
const store = libdiscoreExports[storeName];
if (storeName === name) {
fluxStores.set(storeName, store);
return store;
}
}
} catch { }
res = find(filters.byStoreName(name), { isIndirect: true });
if (res) {
fluxStores.set(name, res);
return res;
}
handleModuleNotFound("findStore", name);
return null;
}
this should be removed probably
c370c6c clean up findStore; don't import commons in web... - Vendicated
example on linux:
<img width="541" height="56" alt="Image" src="https://github.com/user-attachments/assets/50eae77d-67cd-4211-a067-1743477f671c" />
(obviously not valid colide, but just an example)
oh wait you want to add stores to the object put on the window
I see
but it shouldn't do it every time eh
why do you even build a big object of stores
i dont really get the point
how about this @limber skiff
function populateFluxStoreMap() {
const { Flux } = require("./common") as typeof import("./common");
for (const store of Flux.Store.getAll?.() ?? []) {
fluxStores.set(store.getName(), store);
}
try {
const getLibdiscore = findByCode("libdiscoreWasm is not initialized");
const libdiscoreExports = getLibdiscore();
for (const libdiscoreExportName in libdiscoreExports) {
if (!libdiscoreExportName.endsWith("Store")) {
continue;
}
const storeName = libdiscoreExportName;
const store = libdiscoreExports[storeName];
fluxStores.set(storeName, store);
}
} catch { }
}
/**
* Find a store by its displayName
*/
export function findStore(name: StoreNameFilter) {
if (fluxStores.has(name)) {
return fluxStores.get(name);
}
populateFluxStoreMap();
if (fluxStores.has(name)) {
return fluxStores.get(name);
}
const res = find(filters.byStoreName(name), { isIndirect: true });
if (res) {
fluxStores.set(name, res);
return res;
}
handleModuleNotFound("findStore", name);
return null;
}
wtf is this store
958832: function(e, t, n) {
n.d(t, {
Z: () => s
});
var r = n(442837)
, i = n(570140);
let l = {};
class a extends r.ZP.Store {
hasFetched(e) {
return null != l[e]
}
getTopChannelIds(e) {
return "874345844743213126" === e ? ["1041887225819955252", "985996080107892776", "1035280727610241166"] : l[e]
}
}
let s = new a(i.Z,{
GUILD_TOP_READ_CHANNELS_FETCH_SUCCESS: function(e) {
let {guildId: t, topChannelIds: n} = e;
l[t] = n
}
})
},
what guild is 874345844743213126
@shy veldt tell
Cap's Book Community
really or are you meming
Cap's Book Community
cap's book community
I tried widget but it's off
(await Vencord.Webpack.Common.RestAPI.get("/guilds/1015060230222131221/top-read-channels")).body
👍
empty 
Dziruwa is discord staff or something
I tested it out, it's fantastic. However, in the case of the member list headers, if it contains an emoji, the emoji would also suffer the same fate as the text
<img width="81" height="31" alt="image" src="https://github.com/user-attachments/assets/6aa10c05-e476-47ee-8451-a73bcd646c11" />
I looked at how Discord handles emojis in gradient roles (I can say they forgot this case too) but in usernames, they thought about it and separated emojis and text by putting each emoji into their own spa...
487e74a Fix Uint8Array related type errors in new types... - Vendicated
38b8aeb move SettingsSync to api folder - Vendicated
i think it's ready now
vtest fix-circular-deps
Now testing! 
Seems like everything is working fine (for now) 
Seems like everything is working fine (for now) 
Pull Request Overview
Copilot reviewed 102 out of 106 changed files in this pull request and generated 5 comments.
Files not reviewed (1)
- pnpm-lock.yaml: Language not supported
Comments suppressed due to low confidence (1)
src/api/SettingsSync/cloudSync.ts:30
- [nitpick] The cast
as Uint8Arrayis used here. While this may be necessary, TypeScript 5.9 might have stricter type checking. Verify that this cast is actually needed and that the types are compatible.
💡...
The fluxStores has been changed from a Record to a Map. In consoleShortcuts/index.ts, it's converted back to an object via Object.fromEntries(Webpack.fluxStores), but this relies on fluxStores being iterable. Since Map is iterable, this should work, but the type change could affect other code that treats it as a plain object.
Variable 'Settings' is used before its declaration.
Variable 'PlainSettings' is used before its declaration.
[nitpick] The cast as Uint8Array<ArrayBuffer> is used here. While this may be necessary, TypeScript 5.9 might have stricter type checking. Verify that this cast is actually needed and that the types are compatible.
it's so dumb 😭
see the copilot review thing is a cool idea, but the issue with it is that copilot reviews it
Vendicated Vibe Coder
im stupid i think
I've written support for electrons global hotkeys, would this be of interest to the community? I saw vesktop had it on the roadmap, but didn't know if vencord did or even planned for it.
can’t vencord already do global hotkeys
it patches the desktop client
Vesktop has an open pr
I thought it was just patching the renderer, which wouldn't allow internal ipc calls to the electron process?
maybe I need to do some more digging into the patching of it, I was under the impression it wasn't done, so I went full nuclear and made an entire api inside the core.asar lol
FaFa Death
6afcce3 refactor: fix circular dependency issues & impr... - Vendicated
billions must fix merge conflicts
I just opened the PR to see what u changed
and I couldnt find it
cuz it just got merged
LOL
lmfao
i wrote it in the pr description
or just see commit messages
Refactored some more utils
Moved utils/quickCss to api/Themes (it managed themes, quickcss etc lmao)
Moved utils/settingsSync and utils/cloud to api/SettingsSync
Cleaned up apng dependency
Dropped InvisibleChat to get rid of the dependency
now only remote dependencies we have left is Shiki and QuickCss
we could drop shiki tbh it's kinda niche and the plugin is semi abandoned
if only we had plugin statistics
just say we could drop plugin and see how many husks you get
Not the codeblocks 
I will maintain shiki trust
please, not shiki
^^^
this should just work
const settings = useSettings(["plugins.SomePlugin.*"]);
i need it for my pr
would it be best to move this to a vc repo?
wait why not just use tm-grammars?

so good
This adds the ability to do something like
useSettings(["plugins.SomePlugin.*", "notifications.*"]);
to subscribe to any changes to any settings to either SomePlugin or notifications
they dont have jsons
its not gonna yell at me for turning a plugin on and off then on again and prompt restart?
whats injections vs grammar for shiki?
Pull Request Overview
This PR adds prefix path matching functionality to the useSettings hook, allowing components to subscribe to changes for any setting under a specific prefix path using the wildcard syntax (e.g., "plugins.SomePlugin.*" or "notifications.*").
Key changes:
- Added
prefixListenersMap and associated methods (addPrefixChangeListener,removePrefixChangeListener,notifyPrefixListeners) toSettingsStore - Extended
ResolvePropDeeptype to handle wildcar...
Redundant optional chaining: settings?.map is unnecessary since there's already a check settings on the line above. The optional chaining operator can be removed.
Suggested fix:
? settings.map(name => `plugins.${definedSettings.pluginName}.${name}`)
? settings.map(name => `plugins.${definedSettings.pluginName}.${name}`)
The prefix parameter should be typed as P instead of string to enable proper type inference. Currently, the generic parameter P is unused for the function parameter, which means TypeScript cannot infer the correct type for the callback's data parameter based on the prefix string literal.
Suggested fix:
public addPrefixChangeListener<P extends string>(prefix: P, cb: (data: ResolvePropDeep<T, P>, path: string) => void)
public addPrefixChangeListene...
wait bro's right
I didnt know that was possible
Hello, This is a port of my open source desktop pet "Pocket Bird"! The full source code of the project is available here: https://github.com/IdreesInc/Pocket-Bird
The plugin adds a small pixel-art bird that hops around your discord and lands on images, as well as the ability to insert sticky notes that the bird can land on! New birds can be unlocked by catching the feathers that fall every so often. It's a relatively simple pet and does not store any data elsewhere besides the Vencord datas...
both are correct
what are you doing @gritty iris
updating shikis languages
the themes changes I did I discarded just now so im just doing langs
anything but load tsx
but it works 
fixed the display names its all good now
how do you want the json for that tho because I just have them in a test repo rn
I also added the new themes that were in a newer commit 
just added all the missing icons and zig now has one
json repo and hash const is something you would probably want to change
Re-add moreUserTags plugin completely reworked without any crash

the image isnt about the dom it's about the ai commit messages lol
Thanks for your contribution!
However, this is a duplicate and also uses multiple bad practices (polluting the global object, abusing an interval, not using proper plugin lifecycle methods, etc)
horror score scale:
0-2: clean code, no notes
3-4: minor issues, pretty mid but acceptable 👍
5-6: lowkey concerning, needs a cleanup
7-8: straight up rejected, rewrite this asap
9-10: absolute disaster, completely unusable 💀
rate it
ig its conventional commits
or indeed ai
who knows
never seen emojis in commit names in the wild
A specification for adding human and machine readable meaning to commit messages
only ever here in ai prs
this automatically adds the emojis to ur commits
idk why would someone use this
also i have no idea why i have this installed
this doesnt have emotes in commits
what are you talking about
it's just adding fix:/feat:/etc
wym
it does supports gitmojis as an optional feature
so if you set it its automatically use them
it’s just AI garbage 
i live in another dimension ig
yeah conventional commits are fairly common but very few people use them 100% of the time
I personally find it annoying you can't just write fix X with conventional commits
fix: fix plugin being broken
so dumb
indeed
THIS SI EVIL
https://github.com/standard-commits/standard-commits
this is too complex but it says that the commit type is part of the grammar
so you write fix: whatever was broken
yeah and i hate this
should have no colon tbh
YESSSS
YESSSS
well not custom
but custom menu yes
you will be able to add checkbox, slider, submenus etc
anything the context menu api supports
should I add a massive menu with all plugins except you can go one level deeper to change plugin settings
is this insane
⚰️

is this insane
yes cause no setting descriptions.
you should keep quickcss at top level
yes
i disagree
guh
- Allows plugins to add any menu item, not just simple actions
- Adds Theme settings submenu
- Adds Plugin settings submenu
https://github.com/user-attachments/assets/0b84a78f-d14a-4dd5-bbc1-41c31fe56fa7
6820a3c make Manage Themes open a modal instead of sett... - Vendicated
fixme: this should probably be a more generic function that supports opening all settings pages as modal. and it should use more reasonable classnames
TODO
We already have a function for this in the plugin settings code. that function should probably just be made more generic and moved to the PluginManager file
why though
i plan for more plugins to add stuff
we don't want the main menu to be super long
so merging it into the theme submenu is better imo
its really useful and 90% of the time what i open toolbox for
it doesnt matter that much tho
also not like there's much more to do in the current toolbox 
the other 10% of the time its just reconnecting vencord compnaion when im working on it 
This is about to be longer than a vertical monitor for me 😭
BetterSettings 2.0
I tried something like this when I added that submenu to settings cog, but rejected it because it's extremely noisy
Better to allow marking specific settings as quick and having subsubmenus only for those imo
Think I also tried including only restartless settings, which worked ok
array settings when
While a bot is definitely more suitable for the stated use cases, I could see this being useful if you want to schedule a message to a friend without risking accidentally waking them up (realistically people should have their stuff muted at night but you never know, they may have an important reason to keep it unmuted).
why are they reviving a 3 month old pr
happens often, nothing new
without accidentally waking someone up is kind of a non problem in my opinion, just send it anyway 
its to make it machine readable
cuz they can have scopes
fix(core): this thing that was broken
message.split(" ")[0]
[tag] scope: fix thing
its not hard to come up with a different format
😭
i personally prefer to just scope: <message>, i dont try to use scope, but for a different project, conventional commits is hella useful, i cant be bothered to make changelogs and i just categorise my commits, sort them, etc to look nicer
conventional commits are useful if you auto generate changelogs but that’s like the only use
just use AI to parse the commit message
claude had a stroke trying to read my diff and commits 
its not even hard to categorise commit messages by hand AI could probably do it
with conventional commits i just get a oneline log of ever commit between the previous tag and current commit, sort them, then segregate them based on tag
you dont need to use the format if you're already separating commits correctly
vee will hire me to write changelogs (i wont do it)
but this doesn't really result in a user friendly changelog
if you want a user friendly change-log you always have to write it manually
that isnt the point, it's just to satisfy myself lol
i go through the commits and if i deem it breaking or amazing, i separate it
its just barely 90 stars anways, not everyone will take a look at the changelog and go 'eww'
now ur back to conventional commits
just... worse
the whole point is you can just make a new format that just uses verbs
its optional or w/e/
i mean yeah but the point is less about humans reading it and more about machines, or something that takes commits in that format and prettifies them
fix(openInApp): tidal regex
they're still mostly clear to humans though
thats why its a fixed set of prefixes and why it includes it in the grammar
but annoying to write 😭
eh i personally handwrite them but there are tools that can guide you through it like commitizen though they're a bit pointless
its easier to just learn the format
than to use the wizard system
also commitizen is just slow and annoying and just takes away the lock-tf-in moment i would be in
- Add settings for this plugin with a dropdown list of usable followers (currently Oneko (the original), Tora (a cat), and Dog (...))
- This selects different sprites generated from the original oneko program (I can release the tool that assembles the images too) (the images have then been edited manually so that i.e. the Zzzs are more visible) (the images were uploaded to imgur but that can be changed)
- The JS script is loaded on plugin startup, then is cached and reused when changing sel...
I really like the plugin menu and would use it myself for a few plugins but I feel like having all plugins in there is too insane. Maybe we could allow users to pick a few plugins to display there, or Vencord could track (locally) which plugin's settings you open the most and automatically display those
It would be helpful if people could suggest new Toolbox entries that would be useful, either for a specific plugin or for a feature in Vencord
BetterSettings' settings cog submenu lists only enabled plugins. Whatever filter is ultimately chosen, the two should preferably be synced.
yeah, the reason I put everything is because you might want to toggle some plugins quickly
like CustomRPC
I feel like toggling whole plugins on and off should be a pretty rare occurrence
but yeah having all is too insane
If there are plugins that you toggle frequently, put in an "enabled" setting
this PR is still just a draft so I didn't bother with making it consistent with BetterSettings yet 
Fair, just pointing out that your road has been treaded before
I was Just going to PR those once it got merged
Has favoriting plugins been considered before? I feel like it would be nice to be able to like put a star next to them in the settings and they would appear at the top of the plugins list as well as you could also access them from the toolbar maybe
It would be nice to have plugin usage statistics for a whole lot of reasons
But I'm pretty sure Vee has been pretty clear on no telemetry
No I've been thinking about that actually
so we can have sort by popularity etc
I feel like that's kind of the point of favoring them tho? Users can pick what they want prioritized
but i mean that wouldn't really help here
nah just comment on the pr it should be included in it

or pr to the pr if you're crazy
Yop 
@odd heath imagine add/remove current channel/guild from setting in toolbox with array settings
meh
useless
youd need the same structure of plugins > plugin > setting > "Add/Remove from setting" or you spam it with every plugin but thats bad too
and atp you can just left click the chan or guild
unless you only make it an option for specific plugins but then also how do you determine what should get it
or you do a checkbox for each setting itself but that adds so much useless complication
you can open all settings tabs as modals
idk why we'd need that but ig good to have
this turns so gory with it lmao
make some button titles be shorter
something about this is actually kinda cool
yeah
I added it for this
opens as modal
cold






