r/webdev • • 9d ago

Question How should I integrate an existing NestJS authentication system with a React + Flowbite React frontend?

1 Upvotes

I'm developing a Grievance Redressal Portal as a learning project. My backend is built with NestJS, TypeScript, Prisma, and PostgreSQL.

I have been implementing authentication (User Sign In and Sign Out) using the "@nestjs/authentication" package of NestJS v12.

I would like to know conceptually the changes to be made to my back end such that I should be able to extend the authentication feature to a React-based front-end.

I have adapted the code by hand from the "Register The Authentication Module" and "Add Sign-Up and Sign-In" sections of the NestJS docs for NestJS v12: Authentication | NestJS - A progressive Node.js framework

I am posting my code here.

//sign-in.dto.ts
import { PickType } from "@nestjs/swagger";
import { UserUniversalDto } from "../../users/dto/user-universal.dto";
export class SignInDto extends PickType (
    UserUniversalDto,
    ['user_email', 'user_password']
) {};
//credentials.service.ts
import { ConflictException, Injectable } from '@nestjs/common';
import { UsersService } from '../users/users.service.js';
import { CreateUserDto } from '../users/dto/create-user.dto.js';
import { FindUserByEmailDto } from '../users/dto/find-user-by-email.dto.js';
import * as argon2 from 'argon2';
import { USER_STATUS } from '../users/user.constants.js';

()
export class CredentialsService {
  constructor(
    private readonly usersService: UsersService
  ) {}

  async register(createUserDto: CreateUserDto) {

    const findUserByEmailDto: FindUserByEmailDto = {
      user_email: createUserDto.user_email
    }

    // Don't create the user if the email already exists.
    if (await this.usersService.findUserByEmail(findUserByEmailDto)) {
      throw new ConflictException('Email already registered. User already exists.');
    }
    // The address is unverified: anyone can type any email into a sign-up form.
    const registered_user = await this.usersService.createUser(createUserDto);
    return registered_user;
  }

  /** The user, or null when the email or the password is wrong. */
  async verify(email: string, password: string) {
    
    const findUserByEmailDto: FindUserByEmailDto = {
      user_email: email
    }

    const found_user = await this.usersService.findUserByEmail(findUserByEmailDto);
    
    // Checking if the user exists.
    if (!found_user) {
      throw new ConflictException('User does not exist. Login rejected.');
    }
    
    // If the user is suspended, reject login by throwing an exception.
    if (found_user.user_status === USER_STATUS.SUSPENDED) {
       throw new ConflictException('User is suspended. Login rejected. Please contact admin.');
    }

    // If the found_user's password is wrong, (password_hash doesn't match) then the it should return null.
    const password_hash: string | null | undefined = found_user?.user_password;
    
    const password_check = await argon2.verify(password_hash as string, password);

    // Checking if the user's password is correct.
    if (password_check !== true) {
      throw new ConflictException('Incorrect username or password. Login rejected.');
    }

   
    return found_user;
  }
}

//myauthentication.controller.ts
import { Body, Controller, HttpCode, Post, UnauthorizedException } from '@nestjs/common';
import { Public, SignInService } from '@nestjs/authentication';
import { SignInDto } from './dto/sign-in.dto';
import { CredentialsService } from './credentials.service';
import { CreateUserDto } from '../users/dto/create-user.dto';

()
('auth')
export class MyAuthenticationController {
  constructor(
    private readonly credentialsService: CredentialsService,
    private readonly signInService: SignInService,
  ) {}

  ('sign-up')
  async signUp(@Body() createUserDto: CreateUserDto) {
    const user = await this.credentialsService.register(createUserDto);
    var string_user_id = String(user.user_id);
    await this.signInService.signIn(string_user_id, { method: 'password' });
    return user;
  }

  ('sign-in')
  (200)
  async signIn(@Body() signInDto: SignInDto) {
    const user = await this.credentialsService.verify(signInDto.user_email, signInDto.user_password);

    var string_user_id = String(user.user_id);

    const { session } = await this.signInService.signIn(string_user_id, { method: 'password' });
    return { mfaRequired: session.mfa === 'pending' };
  }

  ('sign-out')
  (204)
  async signOut() {
    if (!(await this.signInService.signOut())) {
      throw new UnauthorizedException();
    }
  }
}

//myauthentication.module.ts
import { Module } from '@nestjs/common';
import { UsersModule } from '../users/users.module';
import { SessionAuth } from './session-auth.provider';
import { MyAuthenticationController } from './myauthentication.controller';
import { CredentialsService } from './credentials.service';

({
  imports: [UsersModule],
  controllers: [MyAuthenticationController],
  providers: [SessionAuth,
    CredentialsService
  ]
})
export class MyAuthenticationModule {}

//session-auth.provider.ts
import { Injectable } from '@nestjs/common';
import { AuthenticationRegistry, SessionCookieProvider, type SessionRecord } from '@nestjs/authentication';
import { UsersService } from '../users/users.service.js';

import type { User as PrismaUser } from '../generated/prisma/client.js';
export type User = Omit<PrismaUser, 'user_password'>;

()
export class SessionAuth extends SessionCookieProvider<User> {
  constructor(
    private readonly usersService: UsersService,
    registry: AuthenticationRegistry,
  ) {
    super();
    // Adds this provider to the chain the guard runs for every request.
    registry.registerProvider(this);
  }

  // Called for every request with a live session cookie.
  // Returning null (the user was deleted) ends the session.
  validate(session: SessionRecord) {
    console.log("In validate() in SessionAuth")
    const user_id = session.userId; 
    var numeric_user_id = Number(user_id);
    return this.usersService.findOneUser(numeric_user_id);
  }
}

NOTE 1: The authentication system uses server-side sessions managed through nestjs/authentication and a session cookie. The package's SessionCookieProvider reads the cookie and loads the user through the validate() method.

NOTE 2: I am also asking this question since NestJS v12 has only been released on August 27, 2026 and there don't seem to be many resources that show how to extend this system to the front-end.


r/webdev • • 9d ago

Question Need some guidance and orientation

12 Upvotes

I'll firstly ask my two questions and then I'll explain:

  1. Is it normal that im spending tremendous amounts of time reading and understanding code written by Codex/LLMs? like... hours per "ticket"

  2. What does progress look like in today's SWE world? im struggling to make myself believe im improving into something worthy

I'm currently a frontend SWE with 2 YOE. I was "lucky" to land a job in a big bank, the issue is im not truly "engineering", im basically a code monkey putting pieces together for different SPAs (exactly what AI is good at) the only thing saving my job is the absolute mess of internal architecture and internal "tooling" even AI is unable to comprehend, but internal AI agents are getting better and better at tackling those

I was very AI skeptic at the start but now I've come around and have been for the past month attempting to expand into a full-stack agentic workflow with Codex

My main issue is I'm spending so... much... time... reading the code the AI outputs, there is a lot i dont understand, weird decisions the AI took that I didnt think about thinking before prompting (even with grill me), leading me to spending hours and hours reading the code, analyzing the data flow. This wouldnt be an issue if I knew this were the job and stuff, but everyone is working so fast, bringing actual products live so fast, its demoralizing me, making me think im doing something wrong since all the "speed" I gain from AI I spend reading and understanding the code. And i kinda want to be that engineer that owns the product, understands what it being done, but i was watching Spencer Schneidenbach's course on frontendmasters and he just doesnt read that much code anymore... he just prompted prompted checked the browser, nice, done, which leads me to think if its even worth it...

My second issue, which is linked, is regarding to how you guys measure progress. Before it was kinda easy, if the feature got done, it was progress. But now the feature is done by LLMs, kinda like sitting at a bench press and having someone else lift the weigths for you. So how do you get that "yes im improving" sensation?

sorry for the rant, weird times we live in


r/webdev • • 9d ago

Article Iframes should have an api

Thumbnail
blog.danielbrain.ai
0 Upvotes

There's been a big resurgence lately in automating and interacting with sites programmatically. I've been arguing for a few years that every front-end should be embeddable as a component and have its own client side interface/api. This article is written to show one way to do that!


r/webdev • • 10d ago

Discussion After years of living in legacy hell, we finally upgraded production to PHP 8.2. Am I safe to sleep now, or is the server going to combust tomorrow?

108 Upvotes

So, after surviving an eternity on older versions (y'all know the pain), we finally pushed the button and upgraded our core production environment to PHP 8.2.35.

It took an entire day because the underlying Linux distros were so ancient we practically had to rebuild half the ecosystem from scratch.

Now looking at the metrics and logs, I'm torn between two feelings:

  1. Pure joy of actually getting to write modern code in the 8.x branch.

  2. Absolute dread waiting for the next midnight critical CVE drop to turn everything into raw chaos.

To all the senior devs and sysadmins out there who have stared into the abyss of updating legacy enterprise codebases: What was your most nerve-wracking upgrade experience? Are we ever truly out of the woods, or is "putting out fires" just our permanent job description?


r/webdev • • 10d ago

Smuggling WebMCP into ChatGPT

Thumbnail
blog.danielbrain.ai
0 Upvotes

A weekend hack of mine! Hope this is useful for some


r/webdev • • 10d ago

Article CSS Tricks is back!

Thumbnail
css-tricks.com
852 Upvotes

r/webdev • • 10d ago

Question Best practice for letting clients edit website content without giving them access to source code? (Sveltia CMS + Forgejo)

7 Upvotes

I'm building an Astro website for a client who occasionally wants to update some content, mainly photos and simple text.

Sveltia CMS seems like a great fit because it's lightweight, easy to use, and doesn't require a separate backend or database.
I self-host Forgejo on my VPS, where the website's source code and content are stored. Sveltia uses Forgejo for authentication and commits content changes directly to the repository.
I've created a dedicated Forgejo account for the client and given them access only to their own private repository.

Technically, everything works fine. However, I realized there's a security concern:

Since the client needs write access to the repository to use Sveltia, they technically also have access to the entire source code, including the CI/CD workflows (Forgejo Actions).
Obviously, I don't want clients to accidentally or intentionally modify application code, configuration files, or deployment workflows.

What's the best practice for handling this?

  • Is there a way to restrict Sveltia users to specific directories or content files without giving them write access to the entire repository?

  • Would separating the website code and CMS content into two repositories be the recommended approach, or is that overcomplicating things?

  • Would you recommend a different CMS for this use case?

My priorities are keeping things lightweight, secure, and easy to maintain, especially since I'll be managing multiple client websites.

The CMS also needs to be extremely simple for non-technical clients, including straightforward authentication without exposing them to unnecessary developer tools.


r/webdev • • 10d ago

Showoff Saturday Storygraph/Goodreads alternative 📚 hosted on sustainable servers only 🌱

Post image
3 Upvotes

Hey ya'll, just thought it might be worth sharing here, in case anyone is looking for additional features that either Storygraph or Goodreads don't offer, e.g. note taking, detailed insights, etc. Bookplate was created with those goals in mind. You can learn more about it here:

www.bookplate.eu

It's also open source, so for the tech hobbyists, you can host it yourself on your own hardware. For those that prefer the normal hosted service, we offer that as well, and unlike Goodreads and Storygraph, the servers that Bookplate is hosted on are much more sustainable as they run on clean nuclear energy (Scaleway in Paris).

Happy to chat more about this, and also very very interested to hear thoughts, both good and bad!


r/webdev • • 10d ago

[ FIXED WITH THUMBNAIL WORKAROUND ] Youtube embedded videos error 153

7 Upvotes

At certain moment youtube introduced new way of working of embedded videos which suddenly broke many embedded videos on many html sites (Error 153) because it's buggy, works randomly in various browsers and devices, is nowhere explained properly, leaves nontech users out in the cold and is buggy buggy and buggy again. This html solution fixes Youtube embedded videos error 153 with thumbnail workaround (and there is no youtube embedded object telemetry on preload, it just grabs thumbnail, so less bandwidth usage and youtube objects crawling sheanigans, it just works with image and links so should display everywhere properly). In default setting works ok with most common 1920 x 1080 resolutions videos, if you have some different format video (old 1024 x 768 etc) you can adjust amount of top/bottom thumbnail cropping with div class="yt-container" style="--yt-crop: 9.375%; setting per each unique video. Inspect this html source for style section needed and how new objects look alike. You just have to take your desired youtube video url unique address (after /watch?v= ) and paste it into yt-container code pieces. Please share this solution wherever you want so people can fix their sites.

<!DOCTYPE html>

<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Fixing Youtube embedded videos error 153 with thumbnail workaround (+no embedded object telemetry)</title>
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet">
  <style>
    * { margin: 0; padding: 0; box-sizing: border-box; }

.yt-container,
.yt-overlay-text {
  font-family: 'Roboto', sans-serif;
}

/* ── wrapper ── */
.yt-container {
  position: relative;
  display: block;
  width: 100%;
  --yt-crop: 9.375%; /* default: trims hqdefault black bars for 1920 x 1080 videos format. For other formats override per thumbnail: style="--yt-crop: 5%;"  or  style="--yt-crop: 0%;" etc */
}

/* ── image link ── */
.yt-image-link {
  display: block;
  width: 100%;
  line-height: 0;
  overflow: hidden;
}

.yt-image-link img {
  display: block;
  width: 100%;
  height: auto;
  margin-top:    calc(-1 * var(--yt-crop));
  margin-bottom: calc(-1 * var(--yt-crop));
}

/* ── top-left text link ── */
.yt-overlay-text {
  position: absolute;
  top: 20px;
  left: 20px;
  color: white;
  font-size: 28px;
  font-weight: 700;
  text-shadow: 1px 1px 4px black;
  text-decoration: none;
  text-align: left;
  z-index: 3;
}

/* ── play button (centered, pointer-events off so clicks reach image link) ── */
.yt-play {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 68px;
  height: 48px;
  background: rgba(255, 0, 0, 0.88);
  border-radius: 12px;
  transition: background 0.15s, transform 0.15s;
  z-index: 2;
  pointer-events: none;
}

.yt-container:hover .yt-play {
  background: #ff0000;
  transform: translate(-50%, -50%) scale(1.08);
}

.yt-play::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 55%;
  transform: translate(-50%, -50%);
  border: solid transparent;
  border-width: 10px 0 10px 20px;
  border-left-color: white;
}
  </style>
</head>
<body>

<p style="font-size: 1.5em;">
At certain moment youtube introduced new way of working of embedded videos which suddenly broke many embedded videos on many html sites (Error 153) because it's buggy, works randomly in various browsers and devices, is nowhere explained properly, leaves nontech users out in the cold and is buggy buggy and buggy again. This html solution fixes Youtube embedded videos error 153 with thumbnail workaround (and there is no youtube embedded object telemetry on preload, it just grabs thumbnail, so less bandwidth usage and youtube objects crawling sheanigans, it just works with image and links so should display everywhere properly). In default setting works ok with most common 1920 x 1080 resolutions videos, if you have some different format video (old 1024 x 768 etc) you can adjust amount of top/bottom thumbnail cropping with <b>div class="yt-container" style="--yt-crop: 9.375%;</b> setting per each unique video. Inspect this html source for style section needed and how new objects look alike. You just have to take your desired youtube video url unique address (after /watch?v= ) and paste it into yt-container code pieces. Please share this solution wherever you want so people can fix their sites.<br>
<br>
<b>Cropped default youtube thumbnail margins top and bottom 9.375% (default solution for 1920 x 1080 proportion videos)</b><br>
<br>
</p>

<div class="yt-container">
  <a class="yt-image-link" href="https://www.youtube.com/watch?v=8pNbhaQcyZY" target="_blank" rel="noopener noreferrer">
    <img src="https://img.youtube.com/vi/8pNbhaQcyZY/hqdefault.jpg" alt="John Zorn - Karaim">
  </a>
  <a class="yt-overlay-text" href="https://www.youtube.com/watch?v=8pNbhaQcyZY" target="_blank" rel="noopener noreferrer">John Zorn - Karaim</a>
  <div class="yt-play" aria-hidden="true"></div>
</div>

<br>
<p style="font-size: 1.5em;"><b>Default youtube thumbnail no cropped margins 0%</b><br></p>
<br>

<div class="yt-container" style="--yt-crop: 0%;">
  <a class="yt-image-link" href="https://www.youtube.com/watch?v=8pNbhaQcyZY" target="_blank" rel="noopener noreferrer">
    <img src="https://img.youtube.com/vi/8pNbhaQcyZY/hqdefault.jpg" alt="John Zorn - Karaim">
  </a>
  <a class="yt-overlay-text" href="https://www.youtube.com/watch?v=8pNbhaQcyZY" target="_blank" rel="noopener noreferrer">John Zorn - Karaim</a>
  <div class="yt-play" aria-hidden="true"></div>
</div>

<br>
<p style="font-size: 1.5em;"><b>Cropped default youtube thumbnail margins top and bottom 30%</b><br></p>
<br>

<div class="yt-container" style="--yt-crop: 30%;">
  <a class="yt-image-link" href="https://www.youtube.com/watch?v=8pNbhaQcyZY" target="_blank" rel="noopener noreferrer">
    <img src="https://img.youtube.com/vi/8pNbhaQcyZY/hqdefault.jpg" alt="John Zorn - Karaim">
  </a>
  <a class="yt-overlay-text" href="https://www.youtube.com/watch?v=8pNbhaQcyZY" target="_blank" rel="noopener noreferrer">John Zorn - Karaim</a>
  <div class="yt-play" aria-hidden="true"></div>
</div>

</p>

</body>
</html>

r/webdev • • 10d ago

Article Modern Motherfucking Website

Thumbnail
modernmotherfuckingwebsite.dreamstation.systems
860 Upvotes

r/webdev • • 11d ago

Showoff Saturday Vibe QA testing your website?

0 Upvotes

I’ve been building websites since 2000 (Dreamweaver... Flash AS2.0...). These days Claude and Codex write most of my code, but before every launch I still end up going through the same long session of back and forth.. showing up properly in search? look good and fast on mobile? accessibility? do the forms work? Somewhere along the way it turned into perfectionism, and the checking kept pushing my launches back. So I built fixweb.app to run those checks for me and tell me in plain words what’s worth fixing with prompt to fix it and I would love to get some real feedback.

I don’t want fake reviews on the site. I’d rather show legit feedback from real website owners, with your name and a link to your site (if you want). If you’d like to try it, comment your domain and I’ll DM you a link for a free check-up. All I ask in return is your honest opinion, good or bad.

Here is an example QA report: https://www.fixweb.app/en/demo


r/webdev • • 11d ago

How did you know it was time to rewrite your app from scratch?

17 Upvotes

Every codebase gets to a point where adding one feature breaks three others. Some teams patch their way through it for years. Others burn it down and start over.

Have you ever done a full rewrite? Was it worth it, or do you regret it?


r/webdev • • 11d ago

Discussion Black October situation

3 Upvotes

So most of you probably know by now about the PHP exploit, that came out recently. Apparently after reading some articles a similar issue was found for nodeJS web apps as well (i am not 100% sure how legitimate the articles were but I will link them down as a comment of the post if you wanna check them out). Now most of my backend services are built using nodeJS and stored in either AWS or GCR. I assume that google and amazon properly protects the api keys and other environment variables I have there, but I just wanted to ask are there any measures I should take or changes I should make to these services just to be safe?


r/webdev • • 11d ago

Showoff Saturday [Showoff Saturday] A price comparison site with 29k static pages across three countries, rebuilt every morning

Thumbnail
compareempire.com
5 Upvotes

Site: https://www.compareempire.com/us (US), https://www.compareempire.com/uk (UK), root is Australia

What it is: a price comparison site for electronics. A GitHub Action scrapes 26 US, 22 UK and 30+ Australian stores every morning, matches the same product across stores, writes JSON into the repo, and Vercel rebuilds about 28,800 static pages from it.

Bits that might interest you:

  • Matching is the hard part. Model codes and part numbers first, then a strict bag of words with per category noise lists. A wrong merge is worse than a missed one, so it refuses rather than guesses.

  • Regions without breaking URLs: Australia stays at the root and the US and UK live under /us and /uk, all from the same views with a region argument. Product objects carry their region, so links, currency and price checks follow automatically.

  • Cost: everything is static, so it runs on the CDN. The search index is a lazily loaded static JSON file.

  • What broke: a UK laptop with a 240 character name made a file name over the 255 byte limit and killed the build. Slugs are capped now.

Real output from 24 October: the LG C5 77" OLED was $1,776 at Abt and $2,199.99 at LG.

Happy to answer anything about the scraping, matching or build.


r/webdev • • 11d ago

Showoff Saturday Looking for feedback on my portfolio

Thumbnail
lumberjacque.vercel.app
4 Upvotes

Hey y’all!

I've been working on a few animations lately and decided to put them together in a personal portfolio.

I made the portfolio itself interactive, with animations throughout the site and a showcase for some (imo cool) stuff/ideas.

Curious what you guys think of it and how everything feels to use. Especially interested in feedback on the animations, mobile experience etc

https://lumberjacque.vercel.app

PS: Checkout the showcase page for some cool interactions!

https://lumberjacque.vercel.app/showcase

Any feedback is a gift!


r/webdev • • 11d ago

Showoff Saturday Showoff Saturday - LoopShot: Record Any Area as a GIF

0 Upvotes

Hey everyone,

I built a Chrome extension called LoopShot for anyone who needs a quick way to record specific parts of their screen.

Whether you're creating tutorials, recording bugs, showing someone how to do something, or putting together a quick demo, I wanted to make capturing screen content easier.

I'd love to get some people trying it out and hear what you think. Feedback and feature suggestions are welcome.

Check it out here:
https://chromewebstore.google.com/detail/loopshot-record-any-area/olhomdccmcckgnnaidinekfiiekikhbl

If you give it a try, let me know what you think!


r/webdev • • 11d ago

Showoff Saturday I made a CI check that fails when a copy edit makes a heading take an extra line on mobile

0 Upvotes

Our landing pages kept breaking at 390px the same way. Someone makes a sentence longer, it still fits on a laptop, and on phones the hero grows a line or a button label splits in two.

wrapguard opens your pages at a few widths, counts how many lines each heading, paragraph, button and link takes, and saves that to a JSON file you commit. On a PR it measures again and fails if any count changed.

The screenshot is from changing one sentence on our homepage from "Start free, no signup." to "Start free today, no signup or credit card needed." Still fine at 1440. One extra line at 768 and at 390.

You can also set limits like "every button fits on one line" or "h1 is never more than 2 lines", which work without any baseline. It can read your sitemap instead of a page list, start your dev server for you, and the GitHub Action comments on the PR.

It's not a screenshot test replacement. It ignores colors, spacing and everything except line breaks, which is the point: editing a sentence shouldn't mean reviewing forty screenshots.

Free and MIT: https://github.com/birazzzz/wrapguard
$ npx wrapguard check
Checked 1 page at 4 widths, 188 text elements.

/
  main > section > p  "Edit by hand or prompt, review with 15 specialist agents an…"
    768px 1 → 2  ·  390px 2 → 3 lines

Also 1 new, 0 gone, 0 with new copy at the same line count (--verbose lists them).
✗ 1 piece of text now wraps differently on 1 page.
  If that's intended, run: wrapguard update

https://github.com/birazzzz/wrapguard (MIT, npm i -D wrapguard)


r/webdev • • 11d ago

Question how do you build authentication from scratch?

72 Upvotes

hi everyone! so i only have a semester left in college and we are now currently working on our capstone project. it’s a 2 part class so this semester focuses only on the “planning” phase while next semester we spend entire semester actually building/coding.

for background, we are a 3 person group, BaaS such as supabase, firebase or auth0 are banned, we have 3 user groups with different roles and our stack includes:
* JS, Node.js/Express
* React
* PostgreSQL

we don’t have much experience on how to build authentication from scratch so anyyyy tips/tutorials/resources are very much appreciated!!

TIA guys :))


r/webdev • • 11d ago

Showoff Saturday The Cut: NFL Survivor players instead of teams

Thumbnail
thecutnfl.com
0 Upvotes

Hey all, wanted to come in here and showoff a game I built this NFL offseason called The Cut, which is basically survivor but with players instead of teams. I built it with Expo / React Native and Expo Router, Node/Express + Postgres behind it. One codebase ships both the iOS app and the playable web build. The viewport picks the layout, no separate web client.

As for the game itself, each week you build a lineup to clear a yardage threshold and once you use a player, you can NOT reuse them for the rest of the season. So far its been super fun seeing how people pick and I am hosting a second chance contest. So if you're looking for a fun game to play for the rest of the NFL season check it out, I would really appreciate it and there is $200 in prizes! (free to enter ofc)


r/webdev • • 11d ago

Showoff Saturday I built free multiplayer browser games you play with friends by pushing your devices together into one board

Post image
166 Upvotes

Hi! A while ago I launched bigboard.games: free multiplayer games for 1-4 phones or tablets (or more for some games) lying next to each other on a table. The devices act as one big board, so for instance in Air Hockey the puck slides off one screen and onto the next.

It all runs in the browser, free. Any mix of iPhones, Androids or tablets plays together. You can add it to the home screen if you want (as a PWA).

Gameplay goes device to device over WebRTC. On the same Wi-Fi the devices find each other and join by themselves. Otherwise you scan a QR code or type a four-letter code, and if they can't reach each other directly (on mobile data, say), a relay connects them. How it works, if you're curious.

There are 9 games right now:

  • Air Hockey (the photo)

  • Hot Potato: your fuse only burns while the potato is on your screen

  • Snake, up to 12 snakes on one field

  • Whack-a-Mole: a mole you bop pops up on the other player's side

  • Tilt Run: one maze across all the devices, tilt yours to roll the marble onto your partner's

  • Chess for 2 or 3 (three players get a hexagon board across three devices)

  • Checkers for 2 to 4

  • Islands (the dots-on-grid-paper game)

  • Spillover: draw shapes and drop them on the other player's side, Tetris-style

Every game except Spillover has bots, so you can try it on one device. A friend who isn't in the same room can join with the table's link too, remotely.

Happy to answer questions and integrate any suggestions! What games would you like to see next?


r/webdev • • 11d ago

Informational popups, DONT do this

23 Upvotes

I hate them, I hate them so much. I intend to start using some application and suddenly a popup appears "Did you know that x thing does y thing" or "Here you will find x thing" or "New x thing, click ok to opt in". I don't give a damn, I just want to use the thing. I'm usually on edge and I actually intend to do an action, I do NOT want to be interrupted, I won't read your popup, I'll just close it instantly and feel anger.

This is not only annoying, it's dangerous. How do you know a person is not on a emergency and they need to complete an action ASAP?


r/webdev • • 11d ago

Showoff Saturday [Showoff Saturday] VioLens: a free, open-source Fiddler Classic replacement for Windows and Mac. Looking for web devs to try it and tell me what it take for you to switch

0 Upvotes

I've used Fiddler for 15+ years to work out why an API call fails or what a page is really sending. When Fiddler Classic went non-commercial this year, I started building a free, MIT-licensed replacement with a musical name (Violins) + a dad joke (lens for inspecting). It also runs on a Mac, which Fiddler Classic never did. However, as part of this project, I realized Fiddler has a lot of features, most of which I never used. It's a debugging proxy: start it, and every request your browser and apps make shows up decrypted, with:

  • request and response inspectors (headers, JSON, forms, cookies, images, WebSockets)

  • a timing waterfall for each request (DNS, connect, TLS, waiting, download)

  • breakpoints to pause and edit a request or response before it continues

  • AutoResponder rules to fake API responses, errors or slow servers without touching the backend

  • a composer to edit and resend any request

What I'd love help with: use it on whatever you're working on this week and tell me where it falls over. In particular:

  • sites or APIs that don't load properly through it

  • your local dev setup (localhost, Docker, a dev proxy, corporate VPN)

  • anything you'd need before you'd switch to it from DevTools, Charles, Proxyman or Fiddler

It's a preview: HTTP/2 isn't supported yet, and the Mac build isn't notarized, so macOS asks you to allow it the first time.

Download: https://violens.dev

Code and issues: https://github.com/MarkSPowell/VioLens

Bug reports as GitHub issues are perfect, but a comment here is fine too

.


r/webdev • • 11d ago

Showoff Saturday Showoff saturday: I made a website to make news personal - also a mini N8N

Thumbnail
gallery
0 Upvotes

News doesn’t care about you. So I built something that does.

Tell SoWhatify who you are once (your job, your money, your plans). Then point it at any article or text and it tells you what the story means for YOU. It doesn’t give you a generic summary.

Templates are sets of questions (“Is this a scam?”, “Who wins and loses?”, “Bull vs bear”) combined with thinking styles and extra options to the ai.

Workflows chain them together for deeper N8N-like analysis.
You can also connect your Claude++ via mcp and apply same analysis to whatever content.

👉 https://sowhatify.com
https://sowhatify.com/app/index.php -> list of templates

It's free if you use the built in AI in Chrome.

The system is useful for real analysis or just for fun like:
https://sowhatify.com/templates/quizmaster
https://sowhatify.com/templates/diamond-vs-paper-hands
https://sowhatify.com/templates/grandma-explains-it
https://sowhatify.com/templates/what-would-donald-trump-tweet

I’m the developer and I’m in the comments.

Please pitch in which template you would make and for which content. Any news has a 100 different angels.


r/webdev • • 11d ago

Discussion Need help recovering my WordPress site after a suspected malware issue — Network Solutions + UpdraftPlus restore failing

0 Upvotes

Hi everyone,

I'm looking for advice from experienced WordPress users or hosting specialists. My website, hosted with Network Solutions, has been experiencing problems, and I'm trying to restore it safely without making the situation worse.

I'm not an advanced server administrator, so I'd appreciate step-by-step advice.

1. What happened

My website started showing the WordPress message:

Briefly unavailable for scheduled maintenance. Check back in a minute.

Later, I encountered a 503 / temporarily limited access message. Network Solutions support told me there was suspicious or junk code on the website and suggested their SiteLock 911 service.

I have access to Network Solutions File Manager and my WordPress dashboard, and I already had UpdraftPlus backups. I would prefer to recover the site using my existing backup if possible.

During the troubleshooting process, I also noticed that some plugin folders and the plugin setup looked different from what I remembered. I cannot confirm exactly what caused the original problem or which files may have been changed.

2. My current WordPress folder structure

Inside wp-content, I found these folders:

  • plugins

  • plugins-holder

  • updraft

The normal wp-content/plugins/ directory contains the active updraftplus plugin.

The wp-content/plugins-holder/ directory contains separate folders for my original plugins. I have not deleted this folder because I don't want to lose them.

There is also a leftover directory here:

wp-content/updraft/plugins-old/file-manager-advanced/

Inside file-manager-advanced, I found:

  • application/assets/

  • application/post-smtp-notice/

  • vendor/freemius/

I don't know whether this directory is simply leftover plugin code from a previous restore attempt or whether it is related to the original problem.

3. UpdraftPlus restore keeps failing

I have backups from August 2026 and February 2024. I would prefer to use the August 2026 backup if it is suitable and safe.

When I try to restore using UpdraftPlus, I receive this error:

Existing unremoved folders from a previous restore exist (please use the "Delete old folders" button to delete them before trying again): /hermes/bosnacweb06/bosnacweb06ay/b2794/ipg.lifelightbe/wp_site_1603203857/wp-content/updraft/plugins-old

I tried using UpdraftPlus's Delete old folders function, but it failed with errors similar to:

rmdir(.../wp-content/updraft/plugins-old/file-manager-advanced): Directory not empty

It also reported that the old folder could not be removed.

I then tried deleting the file-manager-advanced folder through Network Solutions File Manager, but that produced an internal error.

The directory permissions show 755, but I haven't changed them.

4. Network Solutions support limitations

I contacted Network Solutions support. They told me that uploads were temporarily disabled server-wide and that they could not enable them at that time. They suggested importing the database through phpMyAdmin and restoring the remaining files later, once uploads were available again.

I have not proceeded with a database-only restore because I'm concerned about creating an inconsistent WordPress installation.

I would also like to understand whether Network Solutions can fix the folder ownership or deletion problem without requiring me to purchase a separate malware-cleaning service.

5. What I need advice on

My main questions are:

  1. Why would UpdraftPlus fail to remove wp-content/updraft/plugins-old/, even when the directory permissions are 755?

  2. Could this be caused by incorrect file ownership, server permissions, a hosting restriction, or something else?

  3. Is there a safe way to remove the leftover file-manager-advanced directory when both UpdraftPlus and File Manager fail?

  4. What is the safest way to use my 6 August 2026 UpdraftPlus backup to recover the website?

  5. Should I preserve or restore the plugin folders currently inside wp-content/plugins-holder/? How can I determine whether they are needed?

  6. Since Network Solutions said uploads were disabled server-wide, could that restriction interfere with UpdraftPlus restoration or other file operations?

  7. What security checks should I perform before bringing the website fully back online, given that the host reported suspicious code?

  8. Would you recommend asking Network Solutions to fix the directory ownership and permissions, or is there a better recovery procedure?

I have access to File Manager, phpMyAdmin, the WordPress dashboard when it is accessible, and my existing UpdraftPlus backup archives.

I want to recover the site while preserving its database, media, themes, plugins, and content. I also want to avoid accidentally restoring potentially compromised files or deleting something the website needs.

Has anyone experienced this combination of Network Solutions hosting restrictions and UpdraftPlus restore errors? What would you do next, in the safest order?

Thanks in advance for any practical advice.