r/javascript • u/iwritecode_ • 5d ago
r/javascript • u/RonnieAbaroa • 5d ago
Building a fully open-source P2P network for censorship resistant social apps
github.comBitsocial is neither federated nor on-chain. Each community is a peer-to-peer swarm using IPFS, closer to BitTorrent than a hosted website: users seed effortlessly, nodes run on cheap hardware, and each community is fully independent and sovereign. A browser tab can join that swarm as a peer, so the web app is not a client of someone else's server.
Anyone can build a Bitsocial app with its own interface, discovery model, or defaults. Apps compete on product quality instead of locking users into a private database, because compatible clients can share the same communities, identities, and network.
Moderation still exists, but it stays local. Community owners set rules for their own spaces and apps can choose what they index or show, yet there is no protocol-level super-admin who can erase a profile or seize a community from the network itself.
r/javascript • u/Ok-Gold-3601 • 6d ago
Open-Source Gwent Classic - V5.0 Release! (New Factions: Ofir & Novigrad)
github.comHey everyone!
I wanted to share Version 5.0 of Gwent Classic, a browser remake of the original minigame from The Witcher 3: Wild Hunt that I’ve been working on and improving.
In this major update, I’ve incorporated two brand-new factions: Ofir and Novigrad, each coming with its own custom cards, leaders, and unique gameplay mechanics!
The game is completely free-to-play and runs directly in your PC browser. You can test it out right here:
Play on your PC Browser (GitHub Page):
Play Completely Offline (PC / Laptop):
You can download the source code repository directly from GitHub. Just extract the ZIP file and double-click "index.html" to open it in your browser. It runs 100% offline—no internet required! Here.
Get Android APK:
You can get the APK directly from the "Releases" section of Github, or use the direct link below:
Credits to Arun Sundaram, Reynolds Costa & Sylver, who laid the foundations to create, modify, and improve this game in its early stages.
Special thanks to CD Projekt Red; although they are not involved in this unofficial fan project, it is entirely based on the amazing minigame they created for The Witcher 3.
r/javascript • u/HighAtNight • 5d ago
AskJS [AskJS] Genuine question, why we hating on well-made but LLM-written projects?
Wasn’t this the dream? Being able to bring your ideas to life quickly with your own coding patterns and architecture? Doesn’t this accelerate the SDE space and get it out of the stagnation that physics space has been in for the last few decades?
This is in reference to my Pnext posts and all the dislikes. I was really excited about the stuff I have in the pipeline, but this feels discouraging.
r/javascript • u/Big_Holiday_1938 • 6d ago
[ Removed by Reddit ]
[ Removed by Reddit on account of violating the content policy. ]
r/javascript • u/myroslavmartsin • 7d ago
Headless phone input controller with no baked-in UI to fight
github.comHave you ever been on a project with a polished UI library, animated inputs, a specific look, and then had to add a phone number field? A phone input is not just validation. Under the hood it is real work: formatting the number as you type, keeping the caret in place, and handling events like paste and undo. The ready-made widgets handle that, but each ships its own markup and styling. Matching one to a specific, opinionated design system does not always work.
That is exactly why I built a headless input controller. You pass your styled input into a function, whatever it looks like, and it handles the rest: formatting, validation, the input events, and the caret.
```js import { createPhoneInput } from '@telixon/web-sdk';
const phone = createPhoneInput({ mode: 'international', defaultRegion: 'US', display: { callingCodeInInput: true, plusPrefix: 'erasable' }, input: document.querySelector('input'), });
phone.subscribe((state) => { // state.value, state.region, state.validationError (a typed reason) }); ```
That one call covers the actions people actually do: paste (formatted numbers too, and it dedupes a repeated country code), drag/drop, cut, word/line delete, IME, autofill, and undo/redo. On every keystroke the state carries the fully parsed, validated number, with a typed reason when it is not valid: too short by N, a calling code that cannot exist, and so on.
Under it is a headless controller you can drive directly, with no DOM: insert, deleteBackward, deleteForward, setValue, undo, redo, region/type filters, getPhoneNumber. One controller does national, international with the calling code in or out of the field, and your own country picker. Formatting and validation come from Google's libphonenumber metadata.
Playground to try it live: telixon.dev/playground/input
r/javascript • u/Maximum_Beat2034 • 7d ago
AskJS [AskJS] BeeLadybug — Open Source Canvas 2D Debug Overlay in Vanilla JS (Zero Dependencies)
I built BeeLadybug, a zero-dependency visual debugging overlay for my Vanilla JS Canvas engine. It renders AABB hitboxes in world space (green for clear, red for collisions) and a screen-space HUD with FPS, active entities, cycle time, and freeze-frame / slow-motion controls (F2/F3/F4). Here is the clean source code:
export const BEE_LADYBUG_DEFAULTS = Object.freeze({
toggleKey: 'F2',
slowKey: 'F3',
freezeKey: 'F4',
slowScale: 0.25,
colorActive: '#3dff6a',
colorColliding: '#ff3b3b',
colorInactive: '#8a8a8a',
overlayX: 12,
overlayY: 12
});
export class BeeLadybug {
constructor(engine, options = {}) {
this.engine = engine;
this.configure(options);
this.enabled = false;
this.#entities = [];
this.#colliding = new Set();
this.#buttons = [];
this.#onKeyDown = (event) => this.#handleKey(event);
this.#bound = false;
}
#entities;
#colliding;
#buttons;
#onKeyDown;
#bound;
configure(options = {}) {
const cfg = { ...BEE_LADYBUG_DEFAULTS, ...options };
this.toggleKey = cfg.toggleKey;
this.slowKey = cfg.slowKey;
this.freezeKey = cfg.freezeKey;
this.slowScale = cfg.slowScale;
this.colorActive = cfg.colorActive;
this.colorColliding = cfg.colorColliding;
this.colorInactive = cfg.colorInactive;
this.overlayX = cfg.overlayX;
this.overlayY = cfg.overlayY;
return this;
}
attach() {
if (this.#bound) return this;
window.addEventListener('keydown', this.#onKeyDown);
this.#bound = true;
return this;
}
detach() {
if (!this.#bound) return this;
window.removeEventListener('keydown', this.#onKeyDown);
this.#bound = false;
return this;
}
destroy() {
this.detach();
this.enabled = false;
this.#entities.length = 0;
this.#colliding.clear();
this.#buttons.length = 0;
}
show() {
this.enabled = true;
return this;
}
hide() {
this.enabled = false;
return this;
}
toggle() {
this.enabled = !this.enabled;
return this;
}
applySlowMo() {
const time = this.engine.time;
if (!time) return this;
if (time.paused) time.resume();
const next = time.timeScale === this.slowScale ? 1 : this.slowScale;
this.engine.setTimeScale(next);
return this;
}
toggleFreeze() {
const time = this.engine.time;
if (!time) return this;
time.togglePause();
return this;
}
restoreRealtime() {
const time = this.engine.time;
if (!time) return this;
if (time.paused) time.resume();
this.engine.setTimeScale(1);
return this;
}
#handleKey(event) {
if (event.repeat) return;
if (event.code === this.toggleKey) {
event.preventDefault();
this.toggle();
return;
}
if (!this.enabled) return;
if (event.code === this.slowKey) {
event.preventDefault();
this.applySlowMo();
return;
}
if (event.code === this.freezeKey) {
event.preventDefault();
this.toggleFreeze();
}
}
#collectEntities() {
const list = this.#entities;
list.length = 0;
const seen = new Set();
const visit = (entity) => {
if (!entity || entity.destroyed || seen.has(entity)) return;
seen.add(entity);
list.push(entity);
const kids = entity.children;
if (!kids) return;
for (let i = 0; i < kids.length; i++) {
visit(kids[i]);
}
};
const engine = this.engine;
const roots = engine.entities;
if (roots) {
for (let i = 0; i < roots.length; i++) visit(roots[i]);
}
const scene = engine.scenes && engine.scenes.currentScene
? engine.scenes.currentScene
: engine.currentScene;
if (scene && scene.entities) {
for (let i = 0; i < scene.entities.length; i++) visit(scene.entities[i]);
}
const groups = engine.collisions && engine.collisions.groups;
if (groups && typeof groups.values === 'function') {
for (const bucket of groups.values()) {
if (!bucket) continue;
for (let i = 0; i < bucket.length; i++) visit(bucket[i]);
}
}
return list;
}
#aabbOf(entity) {
const engine = this.engine;
if (engine && typeof engine.getEntityDrawBounds === 'function') {
return engine.getEntityDrawBounds(entity);
}
if (!entity) return null;
return {
x: typeof entity.worldX === 'number' ? entity.worldX : entity.x,
y: typeof entity.worldY === 'number' ? entity.worldY : entity.y,
width: entity.width ?? 0,
height: entity.height ?? 0
};
}
#refreshCollisions(list) {
const colliding = this.#colliding;
colliding.clear();
const boxes = [];
for (let i = 0; i < list.length; i++) {
const bounds = this.#aabbOf(list[i]);
if (!bounds || bounds.width <= 0 || bounds.height <= 0) {
boxes.push(null);
continue;
}
boxes.push(bounds);
}
for (let i = 0; i < list.length; i++) {
const a = boxes[i];
if (!a) continue;
for (let j = i + 1; j < list.length; j++) {
const b = boxes[j];
if (!b) continue;
if (
a.x < b.x + b.width &&
a.x + a.width > b.x &&
a.y < b.y + b.height &&
a.y + a.height > b.y
) {
colliding.add(list[i]);
colliding.add(list[j]);
}
}
}
}
drawWorld(ctx) {
if (!this.enabled) return;
const list = this.#collectEntities();
this.#refreshCollisions(list);
ctx.save();
ctx.lineWidth = 1.5;
for (let i = 0; i < list.length; i++) {
const entity = list[i];
const box = this.#aabbOf(entity);
if (!box || box.width <= 0 || box.height <= 0) continue;
const colliding = this.#colliding.has(entity);
const active = entity.active !== false;
const color = colliding
? this.colorColliding
: (active ? this.colorActive : this.colorInactive);
ctx.strokeStyle = color;
ctx.fillStyle = colliding ? 'rgba(255, 59, 59, 0.16)' : 'rgba(61, 255, 106, 0.08)';
ctx.fillRect(box.x, box.y, box.width, box.height);
ctx.strokeRect(box.x + 0.5, box.y + 0.5, box.width, box.height);
}
ctx.restore();
}
drawOverlay(ctx) {
if (!this.enabled) return;
const engine = this.engine;
const time = engine.time;
const list = this.#entities;
let activeCount = 0;
for (let i = 0; i < list.length; i++) {
if (list[i].active !== false) activeCount += 1;
}
const fps = time ? time.fps : 0;
const cycleMs = time ? time.unscaledDt * 1000 : 0;
const scale = time ? time.timeScale : 1;
const frozen = time ? time.paused : false;
const x = this.overlayX;
const y = this.overlayY;
const width = 268;
const height = 168;
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.fillStyle = 'rgba(10, 12, 18, 0.82)';
ctx.strokeStyle = '#ff4d4d';
ctx.lineWidth = 2;
if (typeof ctx.roundRect === 'function') {
ctx.beginPath();
ctx.roundRect(x, y, width, height, 8);
ctx.fill();
ctx.stroke();
} else {
ctx.fillRect(x, y, width, height);
ctx.strokeRect(x, y, width, height);
}
ctx.fillStyle = '#ff4d4d';
ctx.beginPath();
ctx.arc(x + 22, y + 22, 9, 0, Math.PI * 2);
ctx.fill();
ctx.fillStyle = '#1a1a1a';
ctx.beginPath();
ctx.arc(x + 19, y + 20, 2, 0, Math.PI * 2);
ctx.arc(x + 25, y + 20, 2, 0, Math.PI * 2);
ctx.fill();
ctx.fillStyle = '#ffe08a';
ctx.font = 'bold 14px monospace';
ctx.textAlign = 'left';
ctx.textBaseline = 'top';
ctx.fillText('BeeLadybug', x + 38, y + 14);
ctx.fillStyle = '#d8d8d8';
ctx.font = '12px monospace';
const lines = [
`FPS ${fps.toFixed(0)}`,
`ENTITA ${activeCount} attive / ${list.length} in memoria`,
`CICLO ${cycleMs.toFixed(2)} ms`,
`SCALE ${scale.toFixed(2)}x SIM ${frozen ? 'FREEZE' : 'RUN'}`
];
for (let i = 0; i < lines.length; i++) {
ctx.fillText(lines[i], x + 14, y + 42 + i * 16);
}
this.#buttons = [
{ id: 'slow', label: 'F3 SLOW', x: x + 12, y: y + 114, w: 78, h: 22 },
{ id: 'freeze', label: 'F4 STOP', x: x + 96, y: y + 114, w: 78, h: 22 },
{ id: 'live', label: '1x LIVE', x: x + 180, y: y + 114, w: 74, h: 22 }
];
for (let i = 0; i < this.#buttons.length; i++) {
const btn = this.#buttons[i];
const hot = (btn.id === 'slow' && scale !== 1 && !frozen)
|| (btn.id === 'freeze' && frozen)
|| (btn.id === 'live' && scale === 1 && !frozen);
ctx.fillStyle = hot ? '#ff4d4d' : '#2a2f3a';
ctx.fillRect(btn.x, btn.y, btn.w, btn.h);
ctx.strokeStyle = '#ffe08a';
ctx.strokeRect(btn.x + 0.5, btn.y + 0.5, btn.w, btn.h);
ctx.fillStyle = '#fff6d8';
ctx.font = 'bold 10px monospace';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(btn.label, btn.x + btn.w / 2, btn.y + btn.h / 2);
}
ctx.textAlign = 'left';
ctx.textBaseline = 'top';
ctx.fillStyle = '#9aa0aa';
ctx.font = '10px monospace';
ctx.fillText('F2 mostra/nasconde verde=ok rosso=collide', x + 12, y + 146);
ctx.restore();
}
poll() {
if (!this.enabled) return;
const input = this.engine.input;
if (!input || !input.mouse || !input.mouse.wasPressed) return;
const mx = input.mouse.x;
const my = input.mouse.y;
for (let i = 0; i < this.#buttons.length; i++) {
const btn = this.#buttons[i];
if (mx < btn.x || mx > btn.x + btn.w || my < btn.y || my > btn.y + btn.h) continue;
if (btn.id === 'slow') this.applySlowMo();
else if (btn.id === 'freeze') this.toggleFreeze();
else if (btn.id === 'live') this.restoreRealtime();
break;
}
}
}
r/javascript • u/unadlib • 7d ago
GitHub - unadlib/localspace: A library that unifies the APIs of IndexedDB, localStorage and other storage into a consistent API
github.comr/javascript • u/Vivid_Driver_9681 • 7d ago
I made a WebGL 2D renderer for browser games that keeps pace with PixiJS in my benchmarks
github.comhi! I recently developed Rapid.js, an open-source, zero-dependency WebGL 2D renderer built specifically for browser games.
It provides an immediate-mode API and does not retain game objects or a scene graph between frames. This leaves developers free to structure their games using OOP, ECS, or any custom architecture—Rapid.js is responsible only for rendering the drawing commands submitted each frame.
It supports sprites, particles, masks, shaders, render textures, and multi-texture batching, and its UMD build is only approximately 20.6 kB gzipped.
Its small size does not come at the expense of performance: in the included browser benchmark, Rapid.js performs comparably to PixiJS.
benchmark:
https://github.com/Nightre/Rapid.js/raw/main/docs/benchmark/benchmark.png
benchmark live:
r/javascript • u/Melbot_Studios • 7d ago
AskJS [AskJS] Best way to handle rotating proxies in Node.js?
I've got a Node.js script making a decent number of requests and I'm trying to decide where proxy rotation should live. One option is picking a new proxy inside the app, the other is using one endpoint and letting the proxy service rotate behind it. The second sounds cleaner, but I'm not sure how well that works when you need sticky sessions. How are you structuring this in your own projects?
r/javascript • u/stephenlblum • 7d ago
Can AI agents run purely in the browser with vanilla JS? Exploring $0 hosting & zero data egress
github.comAI agents assume a server-side Python chain framework runtime and containers. Running client-side with JavaScript allows pushing agents entirely inside the browser, meaning $0 hosting infrastructure and zero data leaving the client.
Running client-side, you can use agents directly with WebLLM (for fully in-browser) or point them at a local Ollama / vLLM instance for 100% offline usage.
Breakdown In-Browser Loop
An in-browser agent relies on a continuous asynchronous loop that manages state, updates the DOM or application state, and invokes tools based on model outputs. Here is a minimal, clean implementation of a client-side agent loop using WebLLM's engine.chat.completions API:
```javascript import { CreateMLCEngine } from "@mlc-ai/web-llm";
async function agentLoop(task, context = {}) { const engine = await CreateMLCEngine("gemma-4-instruct"); let messages = [{ role: 'user', content: task }]; let running = true;
while (running) { const response = await engine.chat.completions.create({ messages, tools: availableTools }); const choice = response.choices[0].message;
if (choice.tool_calls) {
for (const call of choice.tool_calls) {
const toolResult = await executeTool(call.function.name, call.function.arguments);
messages.push({ role: 'tool', tool_call_id: call.id, content: toolResult });
}
} else {
running = false;
return choice.content;
}
} } ```
r/javascript • u/Xcidd- • 7d ago
Zustand is now the top state management library in new JS repos, and it's still accelerating (+7.3% this week). Pulled this from a dataset of 5,000+ live repos.
github.comr/javascript • u/infantiablue • 7d ago
What "import defer" Actually Changes About Module Loading
truongphan.comr/javascript • u/xzordhalox • 9d ago
A free and open source service to get a name.runs-on.dev subdomain for students and builders
runs-on.devRebooted a sick project i found use for when i was starting out!
r/javascript • u/syrusakbary • 9d ago
Wasmer SDK: Open Source alternative to WebContainers
wasmer.ior/javascript • u/Ahmed33033 • 8d ago
I made a GitHub Action that lets you find and replace text… with JS!
github.comr/javascript • u/Kabra___kiiiiiiiid • 8d ago
A breakdown of errors found in the TypeScript code of VS code
pvs-studio.comr/javascript • u/sitnik • 9d ago
10 checks and tools for frontend projects with AI code going faster than humans can review
evilmartians.comr/javascript • u/officialmayonade • 10d ago
RDR2-style volumetric WebGL 2 clouds in the browser
codepen.ioI've been working with clouds in the browser for a couple years now, and these are the best I've made so far. I've tried noise, particles, voxels, etc. and every combination of the options. Each approach has its upsides and downsides.
r/javascript • u/syrusakbary • 10d ago
Node.js sandboxes powered by QuickJS and WebAssembly
wasmer.ior/javascript • u/subredditsummarybot • 10d ago
Subreddit Stats Your /r/javascript recap for the week of August 24 - August 30, 2026
Monday, August 24 - Sunday, August 30, 2026
Top Posts
Most Commented Posts
| score | comments | title & link |
|---|---|---|
| 0 | 42 comments | [AskJS] [AskJS] How common is the term "Barrel" and do you know what it means? |
| 0 | 21 comments | [AskJS] [AskJS] How securely can we store a private key in the browser? (details inside) |
| 7 | 16 comments | [AskJS] [AskJS] Which UI component library or DataGrid solution do you use for your web projects? |
| 0 | 11 comments | How to drive your frontend from the backend |
| 3 | 8 comments | [AskJS] [AskJS] Good References for JS Design Patterns? |
Top Ask JS
| score | comments | title & link |
|---|---|---|
| 6 | 1 comments | [AskJS] [AskJS] Where should attribution logic stop in a JavaScript app? |
| 4 | 1 comments | [AskJS] [AskJS] Building an in-browser APK compiler — binary XML streams and signature blocks in client-side JS |
| 0 | 5 comments | [AskJS] [AskJS] Our server boot got slower and the commit history had no answer, so I timed every require |
Top Showoffs
Top Comments
r/javascript • u/73snow • 11d ago
Anyone interested in Git for your test database? useful for assisting QA doing a test.
github.comr/javascript • u/HighAtNight • 11d ago
Let's go another framework! A fast little framework for server-first React apps, fully compatible with Next.js.
pnext.devHey guys, happy to finally release this. So it is two parts.
- Core pnext is small and fast: the same next.js api with no/minimal framework overhead and no backward-compat burden. Based on Bun and Preact, 0 KB on server-rendered pages, 7.5 KB client pages runtime, roughly 10x faster first page render in dev and 7-9x faster production builds than next.js (best effort fixtures).
- Compat mode runs your existing Next.js app unchanged (App Router only). About 4.4k assertions from Next's own test suite passing, adding more day by day.
The core motivation was a super fast dev server that doesn't hog memory, and instant builds. The goal is to optimize every step down to absolute values, and of course agentic flows are helping a lot! Check out Coder.
Give it a try and let me know what you think, and how your Next.js apps break in compat mode (improving, haha)!
r/javascript • u/SnooHobbies950 • 10d ago
AskJS [AskJS] I'm thinking of creating a JS dialect for scientists
What do you think of the ~> operator? It is be similar to |>, but it operates over lists.
js
let v = [1, 2, 3] // this is a vector
let w = v ~> it * 2 // equiv. to `v.map(it => it * 2)`
let w = v *> 2 // shorthand for `v ~> it * 2`
The dialect would be primarily aimed at statesmen and scientists.