MONIMEGA
  • Blog
    • Politics
    • Software
    • Technology
    • Business
    • Design
    • Hardware
    • Health
    • Italy
    • Music
    • Sports
    • Strategy
    • World
  • Contatto
  • Galleria
  • Informazioni
  • Servizi
  • DOGE “cut muscle, not fat”; 26K experts rehired after brutal cuts

    DOGE “cut muscle, not fat”; 26K experts rehired after brutal cuts

    November 24, 2025
    Hardware

    After Donald Trump curiously started referring to the Department of Government Efficiency exclusively in the past tense, an official finally confirmed Sunday that DOGE “doesn’t exist.”

    Talking to Reuters, Office of Personnel Management (OPM) Director Scott Kupor confirmed that DOGE—a government agency notoriously created by Elon Musk to rapidly and dramatically slash government agencies—was terminated more than eight months early. This may have come as a surprise to whoever runs the DOGE account on X, which continued posting up until two days before the Reuters report was published.

    As Kupor explained, a “centralized agency” was no longer necessary, since OPM had “taken over many of DOGE’s functions” after Musk left the agency last May. Around that time, DOGE staffers were embedded at various agencies, where they could ostensibly better coordinate with leadership on proposed cuts to staffing and funding.

    Read full article

    Comments


    Source: Ars Technica.

  • Open Reel Ensemble Composes Ethereal ‘Magnetic Folklore’ Using Reel-to-Reel Recorders

    Open Reel Ensemble Composes Ethereal ‘Magnetic Folklore’ Using Reel-to-Reel Recorders

    November 24, 2025
    Design

    Open Reel Ensemble Composes Ethereal ‘Magnetic Folklore’ Using Reel-to-Reel Recorders

    Technology is always changing, quickly becoming dated or even obsolete as new updates are released. Remember LaserDiscs? What about 8-tracks? For Japanese musical trio Open Reel Ensemble, analog contraptions meet digital combinations to make unique and experimental sounds. Using reel-to-reel recorders from the 1970s and 1980s as musical instruments, the stage and studio setup is just as interesting as the recordings.

    To achieve mesmerizing and ethereal tunes like “Tape Bowing Ensemble,” the group attaches bows to the analog tape wound around a reel, and they’ve been known to strum the tape like a guitar, tap suspended lengths with drumsticks, or spin reels like DJ turntables. Open Reel Ensemble uses multi-track recorders to gather the sounds, which can then be separated or layered during performances.

    Delving into a nostalgic technology, the group describes their hybrid contraptions and techniques as “magnetic folklore instruments. They tap into a sense of nostalgia for reel-to-reel, also known as magnetic tapes. They’ve described their genre as “Magnetikpunk.”

    Open Reel Ensemble has performed during several of Issey Miyake’s fashion shows in Paris and continues to play at international festivals. Hear more on the group’s YouTube channel and website.

    You might also enjoy ensemble member Ei Wada’s work under the moniker Electronicos Fantasticos.

    Do stories and artists like this matter to you? Become a Colossal Member today and support independent arts publishing for as little as $7 per month. The article Open Reel Ensemble Composes Ethereal ‘Magnetic Folklore’ Using Reel-to-Reel Recorders appeared first on Colossal.


    Source: Colossal.

  • How to Simplify Your React Components with Derived State

    How to Simplify Your React Components with Derived State

    November 24, 2025
    Software

    React simplifies building user interfaces with hooks like useState for managing dynamic values. But it’s common to overuse useState. This often leads to duplicated data and unnecessary complexity.

    For instance, you might store a full name in state when it can be calculated from first and last name props, or duplicate fetched data from a library like React Query. This creates issues like harder debugging, extra re-renders, and synchronization problems.

    In this tutorial, you’ll learn how to use derived state to improve your components. By the end, you’ll know when to derive state instead of storing it, making your React code cleaner and more maintainable.

    1. Prerequisites

    2. What Is a Derived State?

    3. How to Derive State From Existing Data

      • How to Derive State From Props or Other State

      • How to Derive State From a URL

      • How to Derive State From External Data

    4. How to Prevent Recalculation of a Derived State

    5. When to Use useState

      • Controlled Input

      • Independent State Changes

    6. Conclusion

    Prerequisites

    Before you move on, make sure you have:

    • Basic knowledge of JavaScript, TypeScript, React, and React hooks

    • Understanding of asynchronous calls

    • A simple React development setup.

    If you don’t have a React development setup, you can head over to the derived-state repo. The repo has been set up with React Router and React Query. Run the commands below to set it up:

    # clone the repo git clone <https://github.com/Olaleye-Blessing/freecodecamp-derived-states.git> # navigate to the folder cd freecodecamp-derived-states # install the packages pnpm install # start development pnpm dev 

    What Is a Derived State?

    A derived state is any value that can be calculated from existing data. This existing data can be from:

    • Props: Data passed from a parent component.

    • Existing state: Other state variables already in your component.

    • URL parameters: Data from routes or query strings.

    • External data: Data from a fetching library like React Query.

    Storing derivable state in useState can create several issues. First, it can cause debugging problems: more state variables make it harder to trace data flow. The more states you have, the more the number of state changes you need to keep track of while debugging.

    It can also cause unnecessary re-renders. React will trigger a re-render every time you call the state setter function.

    Finally, there can be synchronization issues, as you’re forced to update the “derived state” anytime the source data changes manually. When similar data exists in multiple states, they can get out of sync.

    How to Derive State From Existing Data

    Moving forward, we’ll explore common scenarios where you can derive state instead of storing it in another useState.

    Note: All the code in this article is run in non-StrictMode.

    How to Derive State From Props or Other State

    In this section, we’ll first examine the problems caused by using useState for derivable values. We’ll look at a form component that stores unnecessary states like full name, adult status, and a local copy of an email. You’ll see the re-renders in different scenarios and then learn how to refactor using derived state to remove these problems.

    The Problem With Extra States

    Any value that comes directly from props or other state can be derived on the fly. Take the below as an example, where you pass an email prop to a form component:

    <DetailForm email="[email protected]" /> 

    Here is how the form receives the email prop and also manages its own state:

    import { useEffect, useState, type FormEventHandler } from "react"; interface DetailFormProps { email: string; } const DetailForm = ({ email }: DetailFormProps) => { const [lastName, setLastName] = useState(""); const [fullName, setFullName] = useState(""); const [firstName, setFirstName] = useState(""); const [age, setAge] = useState(0); const [isAdult, setIsAdult] = useState(false); const [localEmail, setLocalEmail] = useState(email); useEffect(() => { setLocalEmail(email); }, [email]); useEffect(() => { setFullName(`${firstName} ${lastName}`.trim()); }, [firstName, lastName]); useEffect(() => { setIsAdult(age > 18); }, [age]); const submitForm: FormEventHandler<HTMLFormElement> = (e) => { e.preventDefault(); console.log({ fullName, age, isAdult }); }; console.count("-- Form render --"); return ( <form onSubmit={submitForm}> <div style={{ marginBottom: "1rem" }}> <label htmlFor="firstName" style={{ display: "inline-block", marginRight: "1rem", width: "10rem", }} > First Name </label> <input id="firstName" type="text" onChange={(e) => setFirstName(e.target.value)} /> </div> <div style={{ marginBottom: "1rem" }}> <label htmlFor="lastName" style={{ display: "inline-block", marginRight: "1rem", width: "10rem", }} > Last Name </label> <input id="lastName" type="text" onChange={(e) => setLastName(e.target.value)} /> </div> <div style={{ marginBottom: "1rem" }}> <label htmlFor="age" style={{ display: "inline-block", marginRight: "1rem", width: "10rem", }} > Age </label> <input type="number" onChange={(e) => setAge(Number(e.target.value))} /> </div> <p> Your receipt will have{" "} <span style={{ borderBottom: "1px solid #fffa", paddingBottom: "1px", }} > {fullName.trim() || "-----"} </span>{" "} as the recipient's name and will be sent to {localEmail || "-----"}. </p> <p> {isAdult ? "You are allowed to order a drink." : "You are not allowed to order any drinks."} </p> <button type="submit" disabled={!isAdult}> Submit </button> </form> ); }; export default DetailForm; 

    The form component collects information from a user. It shows them more information based on their input and the provided email. It maintains some states to keep track of the user’s input.

    c952e785-2b37-4411-987f-01686db8f54e

    While it looks simple, there are some issues with the way state is being used here.

    First of all, a React component re-renders whenever any of its states change. Looking at the UI, the form should only re-render when users input their first name, last name, and age, or when the email prop changes from the parent. This means the form should keep track of just these three states internally, while deriving from the prop and other states.

    But the form keeps track of three extra states (fullName, isAdult, and localEmail). This means that the form will re-render each time these extra states change.

    Let’s see this in action:

    f381aa1f-6244-4065-aa36-123134f26b1b

    As you can see, the form re-rendered twice when the input field changed, instead of once. The form re-rendered the first time the user updated their first name. But for each time the first and last name changed, the second useEffect gets triggered.

    useEffect(() => { setFullName(`${firstName} ${lastName}`.trim()); }, [firstName, lastName]); 

    This is to sync the fullName with the firstName and lastName. Updating the fullName causes the form to re-render the second time.

    The same applies to the isAdult state. When the user updates their age, setAge() re-renders the form, and the third useEffect also causes another re-render.

    Handling Email Changes

    Let’s see what happens when you update the email from the parent component. This is the code that allows you to update the email:

    function App() { const [email, setEmail] = useState("[email protected]"); return ( <> <div style={{ marginBottom: "1rem", border: "1px solid #fff", paddingBottom: "1rem", }} > <h3>Parent Component</h3> <input style={{ padding: "0.4rem 0.8rem" }} type="email" value={email} onChange={(e) => setEmail(e.target.value)} /> </div> <DetailForm email={email} /> </> ); } 

    The parent component keeps track of the user’s email and also updates it through an input element.

    Note: In the <Detail /> component, I’ve removed the useEffects that sync the fullName and isAdult. This is to focus mainly on the email prop. The form component now has this:

    import { useEffect, useState, type FormEventHandler } from "react"; interface DetailFormProps { email: string; } const DetailForm = ({ email }: DetailFormProps) => { const [lastName, setLastName] = useState(""); const [fullName, setFullName] = useState(""); const [firstName, setFirstName] = useState(""); const [age, setAge] = useState(0); const [isAdult, setIsAdult] = useState(false); const [localEmail, setLocalEmail] = useState(email); useEffect(() => { setLocalEmail(email); }, [email]); const submitForm: FormEventHandler<HTMLFormElement> = (e) => { e.preventDefault(); console.log({ fullName, age, isAdult }); }; console.count("-- Form render --"); return <form onSubmit={submitForm}>{/* Rest */}</form>; }; export default DetailForm; 

    9beffe7d-2513-4d3e-9970-21477b16161e

    Updating the email from the parent component causes the detail form to have an extra re-render. Because you are saving the email to a local state, any change to the email prop triggers the useEffect to update the state, causing an extra re-render. Your UI will show stale data without useEffect.

    How to Solve This with Derived States

    You can solve all these extra re-renders by using derived states. Neither fullName nor isAdult directly needs the user’s input for us to know their value. You can calculate their value when their dependent states change without using useEffect. Likewise, you can derive the email directly by using the prop value on the fly.

    import { useEffect, useState, type FormEventHandler } from "react"; interface DetailFormProps { email: string; } const DetailForm = ({ email }: DetailFormProps) => { const [lastName, setLastName] = useState(""); const [firstName, setFirstName] = useState(""); - const [fullName, setFullName] = useState(""); const [age, setAge] = useState(0); - const [isAdult, setIsAdult] = useState(false); - const [localEmail, setLocalEmail] = useState(email); - useEffect(() => { - setFullName(`${firstName} ${lastName}`.trim()); - }, [firstName, lastName]); - useEffect(() => { - setIsAdult(age > 18); - }, [age]); - useEffect(() => { - setLocalEmail(email); - }, [email]); + const fullName = `${firstName} ${lastName}`.trim(); + const isAdult = age > 18; const submitForm: FormEventHandler<HTMLFormElement> = (e) => { e.preventDefault(); - console.log({ fullName, age, isAdult, email: localEmail }); + console.log({ fullName, age, isAdult, email }); }; }; export default DetailForm; 

    The form now stores the necessary state, lastName, firstName, and age. The fullName and isAdult values are derived directly from their dependent values.

    69004769-ddd9-470c-9212-ba7711350b57

    As you can see with the derived state, we have 0 extra re-renders. The form re-rendered only when it should. The form re-rendered once when each input value changed, not twice. Also, when the email changes in the parent component, there is only one re-render.

    How to Derive State From a URL

    You can also use a URL to save dynamic data through route parameters or query strings. Every routing library provides some hooks to access this data.

    For example, React Router provides useParams or useSearchParams. In most cases, the returned values from these hooks don’t need to go into useState again – as this would mean keeping track of two storage, useState and URL.

    Now, we’ll look at some examples using search parameters from React Router. You’ll first see an example that overuses useState and causes extra re-renders and sync issues. Then you’ll see its derived solution.

    Syncing with useEffect

    The component you will be using is a filter component:

    import { useEffect, useState } from "react"; import { useSearchParams } from "react-router"; const Products = () => { const [searchParams, setSearchParams] = useSearchParams(); const [searchQuery, setSearchQuery] = useState(""); const [selectedCategory, setSelectedCategory] = useState(""); const [selectedMaterial, setSelectedMaterial] = useState(""); useEffect(() => { setSearchQuery(searchParams.get("search") || ""); setSelectedCategory(searchParams.get("category") || ""); setSelectedMaterial(searchParams.get("material") || ""); }, [searchParams]); console.count("__ RENDERDED ___"); return ( <div style={{ display: "flex", alignItems: "center", justifyContent: "center", gap: "1rem", }} > <input value={searchQuery} /> <select value={selectedCategory}> <option value="">All Categories</option> <option value="electronics">Electronics</option> <option value="clothing">Clothing</option> </select> <select value={selectedMaterial}> <option value="">All Material</option> <option value="leather">Leather</option> <option value="silk">Silk</option> </select> <button>Clear Filters</button> </div> ); }; export default Products; 

    This component allows users to search for a product and/or filter by category and materials. While it looks simple, this component has all the problems mentioned earlier.

    Let’s see what happens when the component mounts with no filter and predefined filters.

    With no filter:

    fb1ffe32-b3ae-4506-9a33-cdd42cffb5dd

    The component only renders once when there’s no filter. This is good.

    With a predefined filter:

    3a29eb6d-694d-4499-8f78-06cd8702ae3d

    It renders twice because you are trying to make sure your useStates are in sync with the URL by using useEffect. The component renders the first time it mounts, then re-renders because of the dependency in useEffect.

    Initializing useState Directly

    You could be thinking that it’s better to move the getters into the useStates directly, which truly solves the re-rendering case when the component mounts.

    const Products = () => { const [searchParams, setSearchParams] = useSearchParams(); const [searchQuery, setSearchQuery] = useState( searchParams.get("search") || "", ); const [selectedCategory, setSelectedCategory] = useState( searchParams.get("category") || "", ); const [selectedMaterial, setSelectedMaterial] = useState( searchParams.get("material") || "", ); // prev code }; 

    76b4af17-a0c6-4f7d-bc40-fbf013fb2ad9

    As you can see, the component only renders once. There is no more useEffect to trigger another re-render.

    Just keep in mind that this isn’t a solution yet. It has other problems you’ll see soon.

    What happens when any of the filtering changes or when you enter a search query?

    Handling Changes

    Both solution shows that you have unnecessary re-renders. This is because you have to keep two states in sync: both the useStates and the URL.

    import { useEffect, useState } from "react"; import { useSearchParams } from "react-router"; const Products = () => { // prev code const handleSearchChange = (query: string) => { setSearchQuery(query); setSearchParams((prev) => { const newParams = new URLSearchParams(prev); if (query) { newParams.set("search", query); } else { newParams.delete("search"); } return newParams; }); }; const handleCategoryChange = (category: string) => { setSelectedCategory(category); setSearchParams((prev) => { const newParams = new URLSearchParams(prev); if (category) { newParams.set("category", category); } else { newParams.delete("category"); } return newParams; }); }; const handleMaterialChange = (material: string) => { setSelectedMaterial(material); setSearchParams((prev) => { const newParams = new URLSearchParams(prev); if (material) { newParams.set("material", material); } else { newParams.delete("material"); } return newParams; }); }; const clearFilters = () => { setSearchQuery(""); setSelectedCategory(""); setSelectedMaterial(""); setSearchParams({}); }; console.count("__ RENDERDED ___"); return ( <div style={{ display: "flex", alignItems: "center", justifyContent: "center", gap: "1rem", }} > <input value={searchQuery} onChange={(e) => handleSearchChange(e.target.value)} /> <select value={selectedCategory} onChange={(e) => handleCategoryChange(e.target.value)} > {/* prev options */} </select> <select value={selectedMaterial} onChange={(e) => handleMaterialChange(e.target.value)} > {/* prev options */} </select> <button onClick={clearFilters}>Clear Filters</button> </div> ); }; export default Products; 

    Because you are tracking the values in useState, you need to update the useState first before updating the URL. The UI won’t get updated if you update the URL without updating the useState.

    c28d2453-9faa-460d-9cfa-d000b9ed41a4

    Notice that each change leads to 2-3 re-renders.

    Using Derived State

    Using a derived state will solve all the issues you encountered. Your state can be derived directly from the URL without using useState and/or useEffect.

    import { useSearchParams } from "react-router"; const Products = () => { const [searchParams, setSearchParams] = useSearchParams(); const searchQuery = searchParams.get("search") || ""; const selectedCategory = searchParams.get("category") || ""; const selectedMaterial = searchParams.get("material") || ""; const updateFilter = (key: string, value: string) => { setSearchParams((prev) => { const newParams = new URLSearchParams(prev); if (value) { newParams.set(key, value); } else { newParams.delete(key); } return newParams; }); }; const clearFilters = () => { setSearchParams({}); }; console.count("__ RENDERDED ___"); return ( <div style={{ display: "flex", alignItems: "center", justifyContent: "center", gap: "1rem", }} > <input value={searchQuery} onChange={(e) => updateFilter("search", e.target.value)} /> <select value={selectedCategory} onChange={(e) => updateFilter("category", e.target.value)} > <option value="">All Categories</option> <option value="electronics">Electronics</option> <option value="clothing">Clothing</option> </select> <select value={selectedMaterial} onChange={(e) => updateFilter("material", e.target.value)} > <option value="">All Material</option> <option value="leather">Leather</option> <option value="silk">Silk</option> </select> <button onClick={clearFilters}>Clear Filters</button> </div> ); }; export default Products; 

    You now read your values directly from the URL. You also update the URL only whenever any of the values change.

    03d0eabb-1030-4e70-83a0-11feb7f4e9e9

    Notice that you have no re-render when the component mounts, even with predefined filters. The component re-renders once when any filtering key changes.

    This approach gives several benefits:

    • You don’t need useEffect to keep data in sync.

    • You only need to maintain a single source of truth, which is the URL.

    • You have less code, which is easier to maintain.

    How to Derive State From External Data

    Data fetching libraries like React Query provide states that can be used as a single source of truth. Saving this data in useState can sometimes be redundant.

    Look at this example using React Query. First, create a parent component that will render the user details:

    import { useSearchParams } from "react-router"; import UserDetail from "./user-detail"; const UserIdInput = () => { const [search, updateSearch] = useSearchParams(); return ( <input value={search.get("id") || ""} onChange={(e) => updateSearch({ id: e.target.value })} /> ); }; const User = () => { return ( <> <UserIdInput /> <UserDetail /> </> ); }; export default User; 

    You use the <UserIdInput /> to update the user details you need to get. Now create the <UserDetail /> component:

    import { useQuery } from "@tanstack/react-query"; import { useEffect, useState } from "react"; import { useSearchParams } from "react-router"; interface IUser { id: number; name: string; } const getUser = async (id: string) => { const req = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`); await new Promise((r) => setTimeout(r, 2_000)); return req.json(); }; const UserDetail = () => { const [search] = useSearchParams(); const userId = search.get("id") || ""; const { data, isFetching, error: fError, } = useQuery<IUser>({ queryKey: ["user", userId], queryFn: () => getUser(userId), enabled: Boolean(userId), refetchOnWindowFocus: false, }); const [user, setUser] = useState<IUser>(); const [error, setError] = useState<string>(); const [loading, setLoading] = useState(true); useEffect(() => { setUser(undefined); setError(undefined); }, [userId]); useEffect(() => { setError(fError?.message); setLoading(isFetching); setUser(data); }, [data, fError, isFetching]); console.count("__ RENDERED __"); console.log({ data, user, isFetching, loading, error }); if (error) return <div>Try again later!</div>; if (loading) return <div>Loading...</div>; if (user) { return ( <div> <p style={{ fontSize: "2rem" }}> {user.id}: {user.name} </p> </div> ); } return null; }; export default UserDetail; 

    The <UserDetail /> component renders the details of a user. It gets the user’s ID from the URL.

    The component uses the getUser function to get dummy data from an API. It simulates a little network delay by waiting for an extra two seconds with this line of code:

    await new Promise((r) => setTimeout(r, 2_000)); 

    The component uses useQuery to fetch the data. Internally, part of the state React Query keeps track of is the data, isFetching, and error. But the component creates another local state to keep track of these React Query states.

    ac64794f-9264-4e31-989c-5ee1a7274b0e

    Notice that the component renders a total of four times. The component re-renders when React Query and local states change. Also, notice that both states are out of sync at some point. For example, in the third log, the data key from React Query already had the user details, while the local user state is still undefined. You had to use useEffect to update its state.

    It’s more interesting when the component tries to get another user’s details.

    d1810dfd-82d9-4c6d-9c57-fa473f6438e4

    The component reacts to when the user’s ID changes, when React Query state changes, and when local state changes. Similar to the mount problem, the component re-renders more than it needs to: it re-renders six times. Also, the local state was out of sync at some point because we had to rely on useEffect.

    Derive Directly From React Query

    You can correct all these issues by using a derived state like this:

    import { useQuery } from "@tanstack/react-query"; import { useSearchParams } from "react-router"; interface IUser { id: number; name: string; } const getUser = async (id: string) => { const req = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`); await new Promise((r) => setTimeout(r, 2_000)); return req.json(); }; const UserDetail = () => { const [search] = useSearchParams(); const userId = search.get("id") || ""; const { data: user, isFetching: loading, error, } = useQuery<IUser>({ queryKey: ["user", userId], queryFn: () => getUser(userId), enabled: Boolean(userId), }); console.count("__ RENDERED __"); if (error) return <div>Try again later!</div>; if (loading) return <div>Loading...</div>; if (user) { return ( <div> <p style={{ fontSize: "2rem" }}> {user.id}: {user.name} </p> </div> ); } return null; }; export default UserDetail; 

    React Query is now the single source of truth. There is no more manual synchronisation or extra useStates.

    Also, the first thing you will notice is that you have fewer lines of code. This makes it easier to maintain. Check the GIF below to see how often the component renders when it mounts.

    d2b03b52-bffe-4226-9535-5b8d5a4eca20

    As you can see, the component re-renders only twice. Once, when the component initially mounts, and again when React Query state changes.

    e87f1c5e-2741-4c2a-bf1d-9406f06812ce

    The same thing happened when you got another user’s details. You have fewer re-renders: three times as opposed to six times when we kept track of the state locally.

    How to Prevent Recalculation of a Derived State

    Most calculations are fast enough to run on every render. This becomes a problem when it’s an expensive calculation. In such a case, you an use useMemo and/or memo to avoid unnecessary work.

    const Detail = () => { const product = useQuery(...); const users = useQuery(...); const result = useMemo(() => { const expensiveResult = ...; return expensiveResult; }, [product.data]); return ( <> {/* some other components */} <Result result={result} /> </> ); }; const Result = memo(({ result }: { result: number }) => { return <></>; }); 

    With useMemo, the result variable will be recalculated only when product.data changes. This means that the <Result /> component remains the same until product.data changes.

    You can read more here about how to use useMemo in React.

    When to Use useState

    While the article has focused on using derived states, there are cases where you must use useState.

    Controlled Input

    You need useState to manage the input’s value and keep it in sync with the component’s state when building a controlled input.

    import { useState, type FormEventHandler } from "react"; const ControlledInput = () => { const [username, setUsername] = useState(""); const handleSubmit: FormEventHandler<HTMLFormElement> = (e) => { e.preventDefault(); console.log("Submitted value:", username); }; return ( <form onSubmit={handleSubmit} style={{ display: "flex", flexDirection: "column", gap: "1rem" }} > <div> <label htmlFor="username">Username:</label> <input id="username" type="text" value={username} onChange={(e) => setUsername(e.target.value)} style={{ marginLeft: "1rem", padding: "0.5rem 0.4rem", border: `1px solid ${username.length < 2 ? "red" : "green"}`, }} /> </div> <button type="submit">Submit</button> </form> ); }; 

    useState is needed here because:

    • you want to track the user’s value as they type

    • the value comes directly from the user interaction

    Because we are tracking the input value with useState, we can easily validate the username and change the border’s color. freeCodeCamp has an article that explains what controlled inputs are.

    Independent State Changes

    You should use useState when a value can change without depending on other state or props. For example, when toggling a modal, you need useState to keep track of its state.

    import { useState } from "react"; const Modal = () => { const [isModalOpen, setIsModalOpen] = useState(false); return ( <div> <button onClick={() => setIsModalOpen(true)}>Open Modal</button> {isModalOpen && ( <div> <p>Modal Content</p> <button onClick={() => setIsModalOpen(false)}>Close</button> </div> )} </div> ); }; 

    Conclusion

    Managing state is one of the trickiest parts of React. You shouldn’t store what you can calculate, and you should only store what you can’t derive.

    By keeping states minimal and deriving when possible, it will be easier to debug and maintain your components.


    Source: freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More.

  • Trump Is Boosting MAGA X Accounts Operating Overseas

    Trump Is Boosting MAGA X Accounts Operating Overseas

    November 24, 2025
    Technology

    on X has revealed that a number of major MAGA accounts on the platform are operated by people based overseas. And in the days since these accounts were exposed, President Donald Trump has continued boosting several of them.

    Many of the accounts, which have large followings and claim to be conservative people based in Texas or “America First” accounts “promoting good resisting evil,” are actually operated everywhere from Chile and Nigeria to Russia and across Eastern Europe.

    These accounts largely post about divisive issues, including immigration, gender, and Israel. In one instance, a verified account called MAGA NATION with almost 400,000 followers and the American flag in its screen name was revealed to be operated from a non-EU country in Eastern Europe. Many of the accounts feature the names of members of the Trump family, including an Ivanka Trump news account with over 1 million followers that was based in Nigeria. The account has since been suspended.

    On Saturday, Trump shared on Truth Social a screenshot of an X post from an account called “Fan Trump Army.” The account has over 500,000 followers and features an image of Trump as its profile picture. The account operator, according to the new X location feature, is based in India. The account is followed by several people convicted for their parts in the attack on the Capitol on January 6, 2021, as well as disgraced former national security adviser Michael Flynn.

    In recent days, the account holder changed their bio to read: “An Indian who loves America, President Trump, Musk!” An earlier version of the account’s bio, however, made no mention of the account being run by someone in India.

    On Sunday, Trump shared another screenshot of an X post on Truth Social, this time from a verified X account with the screen name: “Commentary Donald J. Trump.”

    “Would you support the idea of foreign-born citizens be barred from running for office? Yes or No,” reads the screenshot. The post also featured a picture of Representative Ilhan Omar with Omar Fateh, a Somali-American lawmaker in Minnesota who unsuccessfully ran for mayor of Minneapolis earlier this month. The account has a picture of the president as its profile picture with a bald eagle in front of the American flag as its background picture. According to X’s new feature, the account appears to be run from somewhere in Africa. (In some cases, X doesn’t specify the country, only the continent or region.)

    In responses to Trump’s post, many called for a ban on foreign-born citizens holding political office, with some posters going further and calling for Omar and Fateh to be deported.


    Source: Wired.

  • Newegg combo deal pairs AMD's Ryzen 9600X, MSI B850 motherboard, Montech Mesh case, and AIO for $338 — $95 off deal includes an $89 AIO

    Newegg combo deal pairs AMD's Ryzen 9600X, MSI B850 motherboard, Montech Mesh case, and AIO for $338 — $95 off deal includes an $89 AIO

    November 24, 2025
    Hardware

    Between rising RAM prices today and swirling, scary rumors about next-gen graphics cards (not to mention hard drives), it’s a tough time to build a PC. But this four-item combo from Newegg could get you about halfway there, while saving some money in the process. It includes a CPU, 240mm AIO, motherboard, and case, with a $95 discount on top of the individual discounts for each component.

    The bundle includes an AMD Ryzen 5 9600X processor paired with an MSI Pro B850-P Wi-Fi motherboard, a Cooler Master 240 Elite AIO, and a Montech X3 Mesh mid-tower gaming case, knocking off an additional 21% if you bought these separately, bringing the price to a low $338.99 when you use the $10 off promo code BFE922.

    • Check out this deal on Newegg

    The Ryzen 5 9600X and its six-core 12-thread configuration have “exceptional gaming performance for the price point,” low power consumption, good efficiency, and showed class-leading single-threaded performance, according to our review. We also liked the price point at release ($279), and now you can find it for even less ($214). While it’s not an X3D chip, this CPU is still a solid base for a gaming system, and there’s room for upgrades in the future.

    The MSI Pro B850-P Wifi is a solid budget-class motherboard with plenty of connectivity. This includes ample storage (four M.2 sockets and four SATA ports), fast integrated Wi-Fi 7, and more. The black and silver design fits in with black or white builds, which is good as the bundled Cooler Master 240 Elite Liquid is white.

    AMD Ryzen 5 9600X, MSI B850-P Wifi, Montech X3 Mesh
    AMD Ryzen 5 9600X, MSI B850-P Wifi, Montech X3 Mesh: was $433.98 now $338.99 at Newegg

    This CPU, motherboard, case, and cooler combo is nicely priced and a great starting point for an AM5 system build. You get a quality processor, 240mm AIO, motherboard, and a high airflow case, all of which are ready for future expansion.

    View Deal

    Below, we’ve included a couple of charts that show off its gaming prowess and single/multi-threaded performance across our suite of tests. As you can see, the 9600X holds it own, particularly in gaming, against processors that cost a lot more.

    Image 1 of 4
    AMD Ryzen 5 9600X
    (Image credit: Future)
    AMD Ryzen 5 9600X
    (Image credit: Future)
    AMD Ryzen 5 9600X
    (Image credit: Future)
    AMD Ryzen 5 9600X
    (Image credit: Future)

    Newegg also throws in a budget mid-tower case, the Montech X3 Mesh. For just under $60 if you bought it alone, Montech includes six RGB fans (three 140mm, and three 120mm) for good airflow out of the box. It has a clear glass side panel on hinges, offering a panoramic view of the internals.

    Overall, the $348.99 price is hard to beat for these parts, especially with the free Cooler Master 240mm Elite AIO. Not only that, the combo provides users with the basis for a great system today and expandability for tomorrow, including reportedly next-gen AMD CPUs. The money saved in this combo deal will undoubtedly help take the sting out of the ridiculously high DDR5 prices.

    For additional help shopping for DDR5, check out our Black Friday RAM deals to get the prices on DDR5 and DDR4.

    If you’re looking for more savings, check out our Best PC Hardware deals for a range of products, or dive deeper into our specialized SSD and Storage Deals, Hard Drive Deals, Gaming Monitor Deals, Graphics Card Deals, Gaming Chair, Best Wi-Fi Routers, or CPU Deals pages.


    Source: Latest from Tom’s Hardware.

  • Where the most chaos could be lurking on Rivalry Week

    November 24, 2025
    Sports

    The penultimate week of the college football regular season gave us plenty of entertainment. We got an incredible comeback in Salt Lake City, we got some resounding blowouts, we got a late Heisman push from Diego Pavia and we got the best ending of the season at the Division II level.

    We didn’t really get much change, however. No team in the top 14 of the College Football Playoff rankings lost, and of the 16 ranked teams that won, 15 won by double digits and 10 won by at least 20. The ACC gave us more chaos thanks to Georgia Tech’s no-show against Pitt, but it was a rather chaos-free weekend overall.

    Luckily, Rivalry Week is on the way, and it usually delivers. We can still squeeze a little bit of chaos out of the 2025 season, so let’s review Week 13 by looking ahead to Week 14. What do we have in store for college football’s best weekend?

    For each category below, games are listed in chronological order. All times Eastern.

    One thing about all the top teams winning this weekend is: The playoff picture remains extremely unsettled. As a general heuristic, I tend to think of any two-loss SEC or Big Ten team or any one-loss Big 12 or ACC team as safely in the field. But with two weeks remaining, we have more of those teams than we have playoff slots: There are six SEC teams and four Big Ten teams with two or fewer losses, plus two Big 12 teams with one loss. Someone deserving is currently on the outside looking in.

    Rivalry Week could alter that picture, of course, though with each of the current top 13 in the CFP rankings favored — 10 by double-digits — that’s not a guarantee.

    Friday

    No. 6 Ole Miss at Mississippi State (noon, ABC) — SP+ projection: Ole Miss by 13.9 (82% win probability)

    No. 12 Utah at Kansas (noon, ESPN) — SP+ projection: Utah by 15.1 (83%)

    No. 4 Georgia at No. 16 Georgia Tech (3:30 p.m., ABC) — SP+ projection: UGA by 12.9 (79%)

    No. 2 Indiana at Purdue (Friday, 7:30 p.m., NBC) — SP+ projection: IU by 33.9 (98%)

    No. 3 Texas A&M at No. 17 Texas (Friday, 7:30 p.m., ABC) — SP+ projection: A&M by 5.3 (63%)

    Six potential at-large teams play Friday, though Indiana, A&M and Georgia are virtually assured of playoff bids at this point. We’ve seen some pundits attempting to will a “The committee might leave Ole Miss out if Lane Kiffin is leaving!” narrative into existence. While I think this is preposterous on its face — Kiffin isn’t the one making the plays for a 10-1 team, and if the committee indeed chose to downgrade the Rebels because of that, we need to tear down the entire committee structure and go back to a formula* — I don’t think the Rebels want to find out what happens if they lose and most of the teams directly below them win.

    (* We should go back to a formula anyway, but that’s neither here nor there.)

    Utah just barely kept hope alive Saturday. With Joe Jackson and the Kansas State run game playing at an unstoppable level, the Utes gave up points on five straight first-half possessions to fall behind 31-21 at halftime. They responded with a 14-0 burst, but K-State responded with a 16-0 run to seize total control. Jackson’s 24-yard score seemed to put the game almost out of reach, but Tao Johnson returned a 2-point pass 100 yards to make it 47-37.

    We were only getting started. Devon Dampier found Larry Simmons for a 20-yard score with 2:47 left, and after a K-State three-and-out (the Wildcats’ first since the first drive of the game), Dampier raced 59 yards on fourth-and-1 to set up his own go-ahead touchdown with 56 seconds remaining. Lander Barton sealed the comeback with an interception.

    Saturday

    No. 1 Ohio State at No. 18 Michigan (noon, Fox) — SP+ projection: OSU by 14.6 (82%)

    No. 13 Miami at Pitt (noon, ABC) — SP+ projection: Miami by 6.0 (65%)

    No. 5 Texas Tech at West Virginia (noon, ESPN) — SP+ projection: Tech by 31.5 (98%)

    UCF at No. 11 BYU (1 p.m., ESPN2) — SP+ projection: BYU by 19.1 (88%)

    No. 7 Oregon at Washington (3:30 p.m., CBS) — SP+ projection: Oregon by 6.7 (66%)

    LSU at No. 8 Oklahoma (3:30 p.m., ABC) — SP+ projection: OU by 11.7 (77%)

    No. 14 Vanderbilt at No. 20 Tennessee (3:30 p.m., ESPN) – SP+ projection: UT by 0.7 (52%)

    No. 10 Alabama at Auburn (7:30 p.m., ABC) – SP+ projection: Bama by 6.0 (65%)

    No. 9 Notre Dame at Stanford (10:30 p.m., ESPN) – SP+ projection: Irish by 31.7 (98%)

    In a different year, Texas and Michigan could both be in “Pull a Rivalry Week upset, and you’re in” situations. Thanks to Georgia Tech and USC losing, the Longhorns and Wolverines could rank 15th and 16th, respectively, when the new CFP rankings come out Tuesday. That would put them in range, but if Vanderbilt beats Tennessee and if BYU and Notre Dame win blowouts as expected, there just might not be space in the inn.

    There are two different ways to root for playoff chaos, I guess. On one hand, you could root for lots of upsets and general nonsense, which is where I tend to lean. That means Go Mississippi State! Go Georgia Tech! Go Michigan! Go Pitt! Et cetera. But upsets might actually clarify the picture a bit in the end, so the other chaos route involves rooting for whatever gives the committee the biggest possible headache. That means Michigan and Texas both pulling upsets, Vanderbilt toppling Tennessee and maybe Ole Miss falling, but chalk winning out otherwise.


    Group of 5 playoff bid

    Temple at North Texas (Friday, 3:30 p.m., ESPN) — SP+ projection: UNT by 24.0 (93% win probability)

    James Madison at Coastal Carolina (Saturday, 3:45 p.m., ESPNU) — SP+ projection: JMU by 21.6 (91%)

    Charlotte at No. 24 Tulane (Saturday, 7:30 p.m., ESPNU) — SP+ projection: Tulane by 33.8 (98%)

    Barring extreme chaos — which might open the door for the Mountain West champ — we’re pretty much locked into a two-team battle for the Group of 5’s guaranteed CFP slot: James Madison vs. the American Conference champ. We’re exceedingly likely to get a Tulane-North Texas battle for the American title in two weeks, and while it’s hard to say how the rankings might play out (since the committee has only deigned to rank Tulane at the moment, and barely at that), it appears these three teams have a greater than 95% chance among them to make the playoff.

    While North Texas put up absurd numbers Saturday against Rice, and Tulane pulled away late against Temple, JMU played with fire against a feisty Washington State team. The Cougars nearly upset two potential playoff teams in recent weeks (Ole Miss, Virginia), and they led JMU until Wayne Knight’s 58-yard burst up the middle with 6:24 left gave the Dukes a 24-20 win. One would think the committee would rank JMU this week, but I’d have ranked them a month ago, so who knows?


    Conference title races

    SEC

    Four teams still have a shot at the SEC title, and their games are all listed in the CFP section above.

    • Texas A&M is in the SEC championship game with a win over Texas, but if the Aggies lose they’re probably out unless both Bama and Ole Miss lose.

    • Alabama is most likely in with a win over Auburn since the Tide boast a win over Georgia and, in a multiway tie that depends on the “conference opponent winning percentage” tiebreaker, they should have the advantage.

    • Georgia is in the clubhouse at 7-1 in SEC play and would win tiebreakers against Ole Miss (because of a head-to-head win) and, if Texas A&M loses, the Aggies (because of the Dawgs’ record against common opponents). But if A&M and Bama both win as favorites (there’s a 41% chance of that, per SP+), the Dawgs are out. I doubt they would mind much.

    • Ole Miss probably needs a win plus Bama and A&M losses. (I say “probably” because we still don’t know for sure how the “conference opponent winning percentage” tiebreaker will play out. Giant superconferences can get really messy.)

    Big Ten

    We probably know what we’re getting in the Big Ten, but it would take only one upset to throw things for a loop. Indiana is unbeaten and needs only to beat Purdue to clinch its first trip to Indianapolis (for a football game, anyway), and since there’s a 98% chance of that happening, that tamps down hopes for major chaos. But if Michigan upsets Ohio State, that likely puts Oregon in if the Ducks win at Washington. If we get double upsets in Ann Arbor and Seattle, however, that puts Michigan in.

    There’s an 80% chance of both Indiana and Ohio State winning, per SP+, but Oregon and Michigan both kept hopes alive by taking care of business Saturday. Michigan took a 14-point lead over Maryland early in the second quarter, traded blows with the Terrapins for a little while, then laid the hammer down in a 45-20 win.

    Oregon, meanwhile, had to work 60 full minutes against No. 15 USC but got the job done in mature fashion. USC cut the Ducks’ lead to 35-27 early in the fourth quarter, but Oregon responded with an 11-play, nearly six-minute drive to go back up 15. It was a dreadfully penalty-heavy affair — the teams combined for 231 rushing yards and 233 penalty yards — but Oregon was never in serious danger. That all but locked up the Ducks’ playoff bid, but it probably won’t earn them a shot at repeating as Big Ten champions.

    Big 12

    Arizona at No. 25 Arizona State (Friday, 9 p.m., Fox) — SP+ projection: Arizona by 4.0 (60% win probability)

    As with the Big Ten, we probably know what we’re getting in the Big 12 championship game: a BYU-Texas Tech rematch. There’s an 86% chance both BYU and Tech win this coming weekend, per SP+, and if they do, they’re in. If they don’t, however, the Territorial Cup and the Utah-Kansas game above could both play a role.

    If Arizona State beats Arizona — an upset, according to SP+ — the Sun Devils could get back to Jerry World to defend its title if Kansas upsets Utah and either BYU or Texas Tech also loses. Utah, meanwhile, needs a win, wins by BYU and Arizona State and a massive upset loss for Texas Tech. Neither of these scenarios are likely, and we’re basically looking at a 98.8% chance that either Tech or BYU wins the conference crown. But true chaos lovers know that if there’s a 98.8% chance that something happens, there’s a 1.2% chance that it doesn’t!

    ACC

    In addition to Miami-Pitt above, three more games will play huge roles in sorting out an incredible ACC mess.

    Wake Forest at Duke (Saturday, 3:30 p.m., ACCN) – SP+ projection: Duke by 0.4 (51% win probability)

    Virginia Tech at No. 19 Virginia (Saturday, 7 p.m., ESPN) – SP+ projection: UVA by 22.2 (92%)

    SMU at California (Saturday, 8 p.m., ESPN2) – SP+ projection: SMU by 16.5 (85%)

    Pitt remains as antisocial as its coach. A week after falling out of the CFP rankings because of a blowout loss to Notre Dame, Pat Narduzzi’s Panthers went down to Atlanta and rolled over Georgia Tech, all but eliminating the Yellow Jackets from ACC contention. Pitt led 28-0 just 19 minutes in, and while Tech was able to close to within 35-28 with 4:51 left after an offensive burst and a cataclysmic fake punt by Pitt, the Panthers clinched the win with a 56-yard touchdown run by freshman Ja’Kyrian Turner. (Subbing in for the injured Desmond Reid, Turner rushed for 201 yards against Tech’s dreadful defense.)

    Now we have three 6-1 teams (Virginia, Pitt and SMU), two of which came into this weekend unranked, followed by 6-2 Georgia Tech and 5-2 Miami and Duke. If all three of the 6-1 teams win, Virginia and SMU will play for the ACC title because Pitt has the inferior record against common opponents. And obviously if only two of the three 6-1 teams win, we know who’s in.

    But since when has the orderly thing happened in this conference? Just know that tiebreakers like “conference opponent win percentage” (which could be very close) and “higher SportSource Analytics team rating” could come into play. And with games in all three primary windows Saturday, this could take all day (and into early Sunday) to straighten out. Hell yeah, let’s get weird.

    American

    Navy at Memphis (Thursday, 7:30 p.m., ESPN) — SP+ projection: Memphis by 11.5 (76% win probability)

    East Carolina at Florida Atlantic (Saturday, noon, ESPN+) — SP+ projection: ECU by 11.1 (76%)

    Rice at South Florida (Saturday, 7 p.m., ESPN+) — SP+ projection: USF by 27.3 (96%)

    Per SP+, there’s a 91% chance that both Tulane and North Texas will win Saturday, and if they do, they’ll play in the American title game. But at 6-1 in the conference, Navy could pounce if either suffers a shocking upset. And if Navy also falls as an underdog at Memphis, the door might open back up for USF or East Carolina. And a blend of computer rankings (including SP+) could end up involved. But again, we have a better than 90% chance of order.

    Sun Belt

    Troy at Southern Miss (Saturday, 3:30 p.m., ESPN+) — SP+ projection: USM by 2.5 (56% win probability)

    This one is straightforward: James Madison has clinched the Sun Belt East, while the winner of Troy-Southern Miss will represent the West as a hefty underdog against the Dukes.

    Mountain West

    San Diego State at New Mexico (Friday, 3:30 p.m., CBSSN) — SP+ projection: SDSU by 4.7 (62% win probability)

    Boise State at Utah State (Friday, 4 p.m., CBS) — SP+ projection: BSU by 3.5 (59%)

    UNLV at Nevada (Saturday, 9 p.m., CBSSN) — SP+ projection: UNLV by 15.8 (84%)

    This one is straightforward at first: We have one team at 6-1 (San Diego State) and three at 5-2 (Boise State, UNLV and New Mexico). If SDSU beats New Mexico, then Boise State holds the tiebreaker over UNLV and would be in with a win; if the Broncos lose, UNLV is in with a win.

    However, a New Mexico upset and a large tie at 6-2 could send us screaming toward the “blended computer rankings (not including SP+ this time)” tiebreaker. Algorithms could get their moment in the sun in the G5.

    Conference USA

    Western Kentucky at Jacksonville State (Saturday, 2 p.m., ESPN+) — SP+ projection: WKU by 3.7 (59% win probability)

    Kennesaw State at Liberty (Saturday, 3:30 p.m., CBSSN) — SP+ projection: KSU by 4.0 (60%)

    Convenient: We have a three-way tie at 6-1 with Jacksonville State, Kennesaw State and Western Kentucky, and WKU and JSU play each other, so the winner is guaranteed a spot. If KSU wins, the Owls will play the WKU-JSU winner for the title. Easy peasy. But if the Owls lose, it could come down to either Jacksonville State’s head-to-head win over Kennesaw (if the Gamecocks lose to WKU) or, say it with me now, “blended computer rankings” if WKU loses to JSU.

    MAC

    Western Michigan at Eastern Michigan (Tuesday, 7:30 p.m., ESPN2) — SP+ projection: WMU by 8.6% (70% win probability)

    Ohio at Buffalo (Friday, noon, ESPNU) — SP+ projection: Ohio by 2.9 (57%)

    Toledo at Central Michigan (Saturday, noon, ESPN+) — SP+ projection: Toledo by 10.3 (74%)

    Ball State at Miami (Ohio) (Saturday, noon, CBSSN) — SP+ projection: Miami by 20.3 (90%)

    By Wednesday morning, we’ll know if this race is messy or super messy. At 6-1, WMU is in with a Tuesday win over EMU. But there’s a four-way tie between CMU, Miami, Ohio and Toledo at 5-2. Most big-group tiebreakers seem to favor WMU and Miami, though Toledo’s head-to-head win over Miami could also come in handy.


    Bowl eligibility

    There are 21 5-6 teams in action this weekend, plus 5-5 Army, needing wins to ensure bowl eligibility. (Technically one of the 5-6 teams, Delaware, is ineligible for a bowl, but the Blue Hens would get one with a win if there aren’t enough eligible teams to fill all the slots.)

    Based on SP+ projections, about 10 of them will win. Quite a few are listed above — Auburn (vs. Bama), Buffalo (vs. Ohio), Kansas (vs. Utah), Mississippi State (at Ole Miss), Rice (at USF), Temple (at North Texas), UCF (at BYU) — but we have loads more to follow, including a trio of “the winner bowls” matchups between 5-6 teams Saturday afternoon.

    The winner bowls

    5-6 Georgia Southern at 5-6 Marshall (Saturday, 1:30 p.m., ESPN+) — SP+ projection: Marshall by 10.2 (74% win probability)

    5-6 Arkansas State at 5-6 Appalachian State (Saturday, 2:30 p.m., ESPN+) — SP+ projection: App State by 1.8 (54%)

    5-6 Penn State at 5-6 Rutgers (Saturday, 3:30 p.m., BTN) — SP+ projection: PSU by 14.4 (82%)

    Penn State has played very well under interim head coach Terry Smith, enough to build at least a little bit of “Maybe just hire Terry?” buzz. The Nittany Lions manhandled Nebraska 37-10 on Saturday — with Kaytron Allen and Nicholas Singleton combining for 204 rushing yards and four touchdowns, just like the good old days — to get within one game of .500. It would be a shock if they suffered a letdown against Rutgers, but the Scarlet Knights do still have a decent offense. (Defense, not so much.)

    Other 5-6 teams

    5-6 Kentucky at Louisville (Saturday, noon, ACCN) — SP+ projection: Louisville by 7.1 (67% win probability)

    Houston at 5-6 Baylor (Saturday, noon, TNT) — SP+ projection: UH by 3.4 (42%)

    Colorado at 5-6 Kansas State (Saturday, noon, FS1) — SP+ projection: K-State by 15.4 (83%)

    UTEP at 5-6 Delaware (Saturday, 1 p.m., ESPN+) — SP+ projection: Delaware by 5.0 (62%)

    Louisiana-Monroe at 5-6 Louisiana (Saturday, 3 p.m., ESPN+) — SP+ projection: UL by 15.6 (84%)

    South Alabama at 5-6 Texas State (Saturday, 3 p.m., ESPN+) — SP+ projection: TXST by 11.4 (76%)

    5-5 Army at UTSA (Saturday, 3:30 p.m., ESPN+) — SP+ projection: UTSA by 7.3 (68%)

    5-6 Florida State at Florida (Saturday, 4:30 p.m., ESPN2) — SP+ projection: FSU by 7.1 (67%)

    Oregon State at 5-6 Washington State (Saturday, 6:30 p.m., The CW) — SP+ projection: Wazzu by 16.6 (85%)

    I usually find myself rooting for the 5-6 team in these types of games, but I’ll be rooting particularly hard for Kansas State (because the Wildcats really have rallied to play mostly decent ball down the stretch), Texas State (because the Bobcats are impossibly entertaining and dropped a series of midseason heartbreakers), and Washington State (because it played incredibly well in three trips east but fell to Ole Miss, Virginia and James Madison by one-score margins).


    This week in SP+

    The SP+ rankings have been updated for the week. Let’s take a look at the teams that saw the biggest change in their overall ratings. (Note: We’re looking at ratings, not rankings.)

    Moving up

    Here are the five teams that saw their ratings rise the most this week:

    North Texas: up 4.0 adjusted points per game (ranking rose from 24th to 18th)

    UNLV: up 3.6 points (from 64th to 54th)

    Wake Forest: up 3.5 points (from 63rd to 52nd)

    South Florida: up 3.2 points (from 38th to 28th)

    Vanderbilt: up 3.2 points (from 18th to 13th)

    With maybe the most video-game-like offensive display I’ve seen, North Texas placed two players on the Heisman of the Week list below and rose into the SP+ top 20. (That’s higher than Boise State ranked ahead of last year’s CFP, by the way. James Madison is in the top 30, too.) Vandy’s ridiculously dominant performance against Kentucky earned the Commodores a late rise as well.

    Moving down

    Here are the five teams whose ratings fell the most:

    Florida: down 4.9 adjusted points per game (ranking fell from 50th to 69th)

    Syracuse: down 4.5 points (from 101st to 118th)

    UCLA: down 3.9 points (from 85th to 101st)

    Colorado: down 3.3 points (from 78th to 96th)

    Illinois: down 3.2 points (from 23rd to 32nd)

    I guess the surprise here is that someone fell further than Syracuse. At 69th overall, this is officially Florida’s worst team since 1979, when the Gators went 0-10-1 in Charley Pell’s first season. If you’re going to struggle, I guess you might as well struggle at a historic level.


    Who won the Heisman this week?

    I am once again awarding the Heisman every single week of the season and doling out weekly points, F1-style (in this case, 10 points for first place, 9 for second and so on). And with just two weeks remaining in the race, we have ourselves a new leader.

    play
    0:57
    Highlight: Diego Pavia sets Vandy record with 484 passing yards in win over UK

    Pavia accounts for 532 total yards and six total touchdowns as the No. 14 Commodores blow out the Wildcats in Nashville, 45-17.

    Here is this week’s Heisman top 10:

    1. Diego Pavia, Vanderbilt (33-for-39 passing for 484 yards, 5 TDs and 1 INT, plus 63 non-sack rushing yards and a touchdown against Kentucky).

    2. Arch Manning, Texas (18-for-30 passing for 389 yards and 4 touchdowns, plus a rushing touchdown and a receiving touchdown against Arkansas).

    3. Drew Mestemaker, North Texas (19-for-23 passing for 469 yards and 3 touchdowns, plus a rushing touchdown against Rice).

    4. Joe Jackson, Kansas State (24 carries for 293 yards and 3 touchdowns, plus 19 receiving yards against Utah).

    5. Raleek Brown, Arizona State (22 carries for 255 yards and a touchdown, plus 33 receiving yards and a TD against Colorado).

    6. LJ Martin, BYU (32 carries for 222 yards and 2 touchdowns, plus 44 receiving yards against Cincinnati).

    7. Wyatt Young, North Texas (8 catches for 295 yards and 2 touchdowns against Rice).

    8. LaNorris Sellers, South Carolina (16-for-20 passing for 274 yards and 2 touchdowns, plus 82 non-sack rushing yards and 2 TDs against Coastal Carolina).

    9. Ja’Kyrian Turner, Pitt (21 carries for 201 yards and a touchdown, plus 12 receiving yards against Georgia Tech).

    10. Jordan Kwiatkowski, Central Michigan (14 tackles, 4.5 TFLs, 1 sack and 1 forced fumble against Kent State).

    What a week for enormous performances. Any of the top seven guys here might have finished first in some other week. When I was watching Wyatt Young break what felt like 17 tackles on his way to an 84-yard touchdown against Rice, I thought he might take the top spot. He ended up seventh.

    In the end, I didn’t have any doubt about the No. 1 spot. The biggest story for Vanderbilt against Kentucky was that its defense showed up for the first time in a few weeks — a very welcome sight with Tennessee on deck in a potential win-and-in game — but Diego Pavia was absolutely ridiculous as well. In his past three games, he has thrown for 1,226 yards (408.7 per game!) with 11 touchdowns and only one interception. Three straight iffy performances in October threw him off the Heisman path a bit, but as you’ll see below, his November work has put him a nose in front in the points race, at least.

    Honorable mention:

    • Carson Beck, Miami (27-for-32 passing for 320 yards and 4 touchdowns against Virginia Tech).

    • Devon Dampier, Utah (18-for-33 passing for 259 yards and 2 touchdowns, plus 110 non-sack rushing yards and 2 TDs against Kansas State).

    • Joe Fagnano, UConn (33-for-46 passing for 446 yards and 3 touchdowns against Florida Atlantic).

    • Kevin Jennings, SMU (29-for-37 passing for 303 yards and 3 touchdowns, plus a rushing touchdown against Louisville).

    • Amari Odom, Kennesaw State (24-for-34 passing for 387 yards and 5 touchdowns, plus 52 non-sack rushing yards and a TD against Missouri State).

    • Darryl Peterson, Wisconsin (6 tackles, 3 sacks, 1 forced fumble and 2 pass breakups against Illinois).

    • Dominic Richardson, Tulsa (28 carries for 203 yards and a touchdown, plus 22 receiving yards against Army).

    • Jalen Stroman, Notre Dame (eight tackles, two TFLs and a pick-six against Syracuse).

    Joe Fagnano threw for 446 yards, and I couldn’t even squeeze him in the top 10!

    Through 13 weeks, here are your points leaders. (Points over the past four weeks is the tiebreaker):

    1. Diego Pavia, Vanderbilt (34 points)

    2. Julian Sayin, Ohio State (29 points, 13 in the past four weeks)

    3. Ty Simpson, Alabama (29 points, zero in the past four weeks)

    4. Taylen Green, Arkansas (27 points)

    5. Fernando Mendoza, Indiana (26 points)

    6. Gunner Stockton, Georgia (25 points, six in the past four weeks)

    7. Trinidad Chambliss, Ole Miss (25 points, zero in the past four weeks)

    8. Demond Williams Jr., Washington (21 points)

    9. Haynes King, Georgia Tech (18 points)

    10. Drew Mestemaker, North Texas (16 points, eight in the past four weeks)

    We still have seven players within 10 points of the lead, so this is far from settled.

    The current ESPN BET betting odds still have Mendoza (-130) and Sayin (+425) leading the way, with Notre Dame’s Jeremiyah Love (+500) and Pavia (+600) as the only other realistic contenders. (A&M’s Marcel Reed is at +1400, and somehow Georgia’s Gunner Stockton is only at +3500.) We still have time for a shift in conventional wisdom – I’d personally view this as a three-way tie between Mendoza, Sayin and Pavia at this point – but it still looks like we may be gearing up for a winner-take-all Mendoza-Sayin matchup in the Big Ten championship game.


    My 20 favorite games of the weekend

    It’s fair to admit that most of the biggest games of the week weren’t incredibly gripping, but if you did a little digging around, you were rewarded.

    1. Division II: Benedict 25, Wingate 24. This was the only possible choice for the No. 1 spot. Benedict trailed 24-7 in the first round of the D-II playoffs, and Wingate was lining up for a 21-yard chip-shot field goal to go up 20. But Isaiah Isidore blocked the field goal and returned it 95 yards for a touchdown. Then Tre Simmons scored with 3:36 left to make it 24-19. The Bulldogs got the ball back at their 14 with 19 seconds left and quickly threw three incompletions. It was time to try one of those lateral-fest plays that never work.

    It worked.

    play
    1:12
    Division II playoff game ends on unbelievable cross-field lateral TD play

    Benedict stuns Wingate with a cross-field lateral to score a long touchdown to advance in the Division II playoffs.

    It apparently worked so well that the cameraperson lost his or her mind halfway through. Malik Mullins’ touchdown, after a perfectly timed lateral and an absurd burst of speed, gave Benedict the win and a spot in the second round. Best ending of the season.

    2. No. 12 Utah 51, Kansas State 47. I don’t know what happened to Utah’s defense in this one, and I don’t know whether the CFP committee will punish the Utes for falling short of expectations, but this was a magnificent game all the same.

    3. FCS: Bethune-Cookman 38, Florida A&M 34. The HBCU universe always provides drama, but it outdid itself this week, not only with the Benedict game but also with this Florida Classic thriller, which saw four lead changes — and four long touchdowns — in the final eight minutes. Jamal Hailey put FAMU up 27-24 with a 72-yard touchdown run, but Bethune-Cookman went ahead 44 seconds later on a 67-yard pass from journeyman Timmy McClain to Javon Ross. FAMU went back ahead with 2:19 remaining, but on fourth-and-8 with 27 seconds left, McClain found Josh Evans somehow wide open for a 41-yard score.

    The moment the Classic was ours 🫨🫨🫨🫨 pic.twitter.com/FNmtrPjbnf

    — 🏈 Bethune-Cookman Football (@BCUGridiron) November 23, 2025

    4. UConn 48, Florida Atlantic 45. UConn hasn’t had the greatest attention span in the world against lesser teams, but that’s been great for our entertainment. The Huskies led 24-3 after the first quarter, but FAU took the lead on a 90-yard Dominique Henry catch-and-run midway through the third. UConn responded with 14 quick points, but FAU took another lead with 2:11 remaining. UConn drove 75 yards in 1:45 to make it 48-45, but FAU drove 56 yards in just 22 seconds … but badly missed a 36-yard field goal at the buzzer.

    Wheeeee!

    5. Duke 32, North Carolina 25. UCLA gave us one of the worst fake field goals you’ll ever see late Saturday night (I’m not even going to share a link; you’ll have to look it up to find that monstrosity), but that only provided balance to the universe because a few hours earlier Duke pulled off one of the smoothest fakes you’ll ever see. Run, kicker, run!

    DUKE PULLS OFF THE FAKE FIELD GOAL 🤯 @DukeFOOTBALL pic.twitter.com/syr9FoOdue

    — ACC Network (@accnetwork) November 22, 2025

    Todd Pelino‘s sprint set up the winning TD.

    6. Tulsa 26, Army 25. With its methodical, relentless option game, you would figure Army would be one of the worst teams against which to attempt a late comeback. But trailing 25-14 with less than five minutes remaining, Tulsa scored on a 48-yard Seth Morgan field goal, then picked off a Cale Hellums pass (!) and scored with 1:53 left. The Golden Hurricane missed a game-tying 2-point conversion and couldn’t recover the onside kick, but no worries! They stuffed Army on fourth down, and Dominic Richardson rushed five times for 37 yards to set Morgan up for a game-winning 27-yarder.

    7. Iowa 20, Michigan State 17. This one was remarkably similar to Tulsa-Army, only it was the favorite making the comeback. After a dire three quarters, Iowa found itself down 17-7 heading into the fourth, but a Drew Stevens field goal and a Jacob Gill touchdown tied the game with 1:29 left. Overtime? Nope! Michigan State went four-and-out, and Mark Gronowski completed three passes for 54 yards to set Stevens up with a 44-yarder. Being that he’s awesome, Stevens made it with ease.

    DREW STEVENS WINS IT FOR IOWA ON SENIOR DAY ‼️@HawkeyeFootball pic.twitter.com/xl3IO3Wl9g

    — FOX College Football (@CFBONFOX) November 23, 2025

    It was his fourth career winner.

    8. FCS: Tarleton State 45, Austin Peay 44 (OT). On one hand, Tarleton State has slipped a bit in November and won’t enter the FCS playoffs with great title odds. On the other hand, all we care is that we’re entertained! And this game was bonkers. APSU went up early and led 28-14 at halftime, and TSU had to tie the game on three separate occasions — including on a 41-yard Corbin Poston field goal with four seconds left — to force overtime. The Texans scored in two plays in overtime, but APSU responded with a 25-yard Chris Parson run on its first play. The Governors, 18.5-point underdogs, naturally went for two points and the win … and Parson airmailed an open receiver. Oof.

    play
    1:18
    Austin Peay Governors vs. Tarleton Texans: Full Highlights

    Austin Peay Governors vs. Tarleton Texans: Full Highlights

    9. FCS: South Dakota State 34, North Dakota 31 (OT). You know who didn’t airmail an open receiver? SDSU’s Jack Henry. The Jackrabbits trailed 20-7 with 17 minutes left but made a 21-0 charge before UND tied the game at 28-28 with 1:52 left. The Fighting Hawks settled for a field goal to open overtime, and SDSU was looking at a long-range FG to tie, but Henry scrambled to his right and found a leaping Grahm Goering for the game-winner.

    play
    0:24
    Jack Henry throws 23-yard touchdown pass vs. North Dakota

    Jack Henry connects for 23-yard TD pass

    Not only was this a clutch play, but it was a season-saver — the Jackrabbits edged their way into the FCS playoffs because of it.

    10. Louisiana 34, Arkansas State 30 (Thursday). We got a wacky win probability chart for this one. ASU led at halftime thanks to both a Cody Sigler fumble return touchdown and a Chauncy Cobb kick return score. UL eased ahead in the second half, but ASU drove 89 yards in just over two late minutes. Unfortunately, the Red Wolves needed a 90th yard. Jaylen Raynor was stopped at the 1 as time expired.

    11. Northwestern 38, Minnesota 35.

    12. New Mexico State 34, UTEP 31.

    13. Louisiana Tech 34, Liberty 28 (OT).

    14. ForeverLawn Bowl: Wabash 32, Ohio Northern 31.

    15. FCS: Albany 31, Monmouth 24.

    16. TCU 17, No. 23 Houston 14.

    17. Kennesaw State 41, Missouri State 34.

    18. FCS: Tennessee Tech 20, UT Martin 17.

    19. Division III: Wilkes 37, Shenandoah 35.

    20. FCS: Montana State 31, Montana 28.


    Source: www.espn.com – TOP.

  • Pentagon says it is investigating US senator over video urging troops to refuse illegal orders

    Pentagon says it is investigating US senator over video urging troops to refuse illegal orders

    November 24, 2025
    Politics

    Investigation of Mark Kelly comes after Trump accused the Democrats in the video of ‘seditious behavior, punishable by death’

    The Pentagon says it is investigating Arizona senator Mark Kelly for possible breaches of military law after the federal lawmaker joined a handful of other Democrats in a video calling for US troops to refuse unlawful orders.

    It is extraordinary for the Pentagon to directly threaten a sitting member of Congress with investigation. Until Donald Trump’s second presidency, the institution in charge of the US military had usually strived to appear apolitical.

    Continue reading…


    Source: World news | The Guardian.

  • Our Favorite Unbound Merino Wool T-Shirts Are on Sale for Black Friday

    November 24, 2025
    Technology

    company Unbound Merino has kicked off its Black Friday sale with deals on our favorite merino wool clothing. This is the only sale of the year for Unbound Merino (though you can sign up for the mailing list, which offers coupons and deals), and a great chance to round out your travel wardrobe with some excellent merino wool.

    From casual, everyday T-shirts, to underwear, socks, and great merino travel pants, Unbound has a little something for everyone. We’ve combed through the site and found a few of our favorite deals. Be sure so see our guide to the Best Merino Wool T-shirts, Best Merino Wool Clothes, and the Best Base Layers for more great merino wool options.

    What’s So Great About Merino Wool?

    Merino wool is great because you’re stealing a sheep’s ability to keep itself warm or cool based on the temperatures it’s in. This is a process often referred to as thermoregulation. Merino sheep have thinner, softer wool than what most people think of when they think of wool. The sheep evolved this soft coat to keep them comfortable across a wide range of temperatures. The result is a fabric that’s comfortable to wear next to your skin. For the softest tees, look for fabrics that are either superfine or ultrafine—anything 17 µm or higher—like Unbound’s T-shirts.

    Wool is sustainable, too. One sheep can produce 4 to 5 pounds of wool per year. While cotton has its place, and so does the occasional synthetic garment, merino wool is a remarkable fabric that’s the cornerstone of my wardrobe. I don’t think you can have too many merino pieces in your closet, but it’s not cheap, which is why we’re featuring these deals.

    What’s So Great About Unbound Merino?

    I like Unbound’s T-shirts because they’re 100 percent merino wool, no synthetics involved. That means all the antibacterial, odor-resistant, moisture-wicking, temperature-regulating goodness of merino wool … just works. I’ve found Unbound’s T-shirts in particular to be very quick-drying and wrinkle resistant, two of the reasons I think they’re the best merino T-shirts for travel. The company’s pants are also have a very high wool percentage (95 percent), and they roll up nicely, making them very packable. Do you need special travel clothing? No, but Unbound’s merino wool is naturally odor-resistant, which means you need fewer pieces in your bag. The company also offers a 30-day guarantee. If you don’t like it, you can send it back.

    How to Care for Merino Wool

    Most merino products come with care instructions. Unbound Merino’s T-shirts should be washed cold with like colors, then laid flat to dry. Whatever you do, don’t bleach them and don’t tumble dry them. The latter is especially destructive. I do it to every wool T-shirt I test and it makes me sad, but I know some of you won’t listen and will do it anyway, so I have to know what happens so I can warn you. Don’t tumble dry. Just put it on a drying rack. It doesn’t take more than a day. Seriously, you just spent $80 (on sale!) in a t-shirt, take care of it. Properly cared for, high-quality merino clothing like Unbound’s is incredibly durable and will last for years. Throw it in the dryer and the pilling starts almost immediately.

    Do I always lay them flat to dry? No. When traveling I usually hand-wash in the sink and then drape them over the shower curtain rod to dry, which hasn’t seemed to have much negative impact. The issues with hanging wool to dry is that it will stretch out from the water weight. This is particularly true with 100 percent merino, like Unbound’s T-shirts.

    I’ve never had a problem storing merino in my closet between wears, but for long-term storage, I recommend you take precautions against moths, which are notorious for eating holes in wool. I have lost merino garments to moths. I make sure to wash and thoroughly dry whatever I am storing, then I seal it in a compression bag. Another option is to put your merino garment in a cotton bag or otherwise wrap it in cotton and then put it in a plastic bin. It’s very important to make sure that the garment is completely dry before using any of these storage methods, otherwise your wool will smell musty and moldy. Other options include storing your garment in a cedar chest, which is a good natural deterrent for moths, or use moth traps or lavender sachets, which will repel the moths.

    Merino wool dusty teal t-shirt on a light gray background
    Courtesy of Unbound Merino

    Unbound

    Merino T-Shirt

    $88 $80 (9% off)

    Unbound (Women’s)

    $90 $80 (11% off)

    Unbound (Men’s)

    Unbound’s T-shirts were my introduction to the brand, and they’re still one of my favorite merino T-shirts. This T-shirt is incredibly soft, and because it’s 100 percent merino wool it’ll stay odor free for ages—as long as five or six days in my testing. This depends on local temps, what you’re doing, etc. I also love that the cut of Unbound’s crew neck merino T-shirt is not overly technical, like many merino T-shirts. This is just a regular, stylish T-shirt that doesn’t make you look like an Alex Honnold wannabe. It’s also lightweight and packs down to a tiny roll, which is perfect if you’re looking to simplify down to one bag (really, is there any other way to travel?).

    The final thing I love about these is how fast they dry. In most climates, you can give it a wash in the sink at night, roll it up in a towel, wring it dry, lay it out flat and it’ll be dry by morning. Speaking of, Unbound’s T-shirts do need to be babied a little. To help them last a long time I recommend hand washing and line-drying. Also note that while I like the merino crew neck, the V-neck is also on sale for $80 ($10 off).

    Image may contain: Clothing, Pants, and Jeans
    Courtesy: Unbound Merino

    Unbound

    Relaxed Merino Travel Pants

    $228 $198 (13% off)

    Unbound Merino (Men’s)

    $225 $205 (9% off)

    Unbound Merino (Women’s)

    Unbound’s merino travel pants are a light and comfortable merino blend, with plenty of stretch and freedom of moment, thanks to the 5 percent elastane. These have a more formal look, and you might even be able to pull off going to office in them, depending on your office and how far your boss’s definition of “business casual” stretches. I’ve worn them to nice restaurants without a second look, and yet they don’t scream “I’ve got money” when you’re stumbling back to your hotel room at 2 am.

    As you would expect from anything Unbound makes, these pack down fantastically small. You can pack two pairs of these for every pair of jeans. Again, for serious travelers looking to live out of a single carry-on bag, that’s huge. The only downside to that is that these are on the thin side, not something you’d want to wear alone in cold climates. If you’re like me and have to deal with winter, throw a good base layer underneath them and you’ll be fine. The slim fit pant is also on sale if that’s more your style.

    Image may contain: Clothing, Pants, Khaki, and Coat
    Courtesy: Unbound Merino

    Unbound

    Travel Pants T-Shirt Bundle

    $318 $270 (15% off)

    Unbound Merino (Men’s)

    $313 $275 (12% off)

    Unbound Merino (Women’s)

    One of the best ways to save on Unbound Merino T-shirts and pants is to go for the T-shirt bundles and other combo packs. Right now you can get the Travel Pants + T‑Shirt Bundle for $270 ($48 off). That saves you an extra $10 over buying the t-shirt and pants on sale individually. There are quite a few other bundles as well, including the T-shirt 3-pack for $220 ($50 off) which is $20 cheaper than buying three T-shirts on sale, and the boxer briefs pack for $75 ($15 off).

    Other Great Deals

    Courtesy of Unbound

    Unbound

    Merino Boxers

    $45 $40 (11% off)

    Unbound

    I know what you’re thinking: Wool underwear, isn’t that what nineteenth-century lumberjacks wore? Probably. Those lumberjacks were smart. They may not have had nice soft merino underwear like Unbound’s merino boxers, but at least they knew that wool underwear was warm without being hot, great at wicking moisture, and capable of several wears without undue odors. The women’s underwear is also on sale; editor Adrienne So tried it. The fabric is thick and even made its way through the dryer without warping and twisting.

    These Unbound boxers are 84 percent merino wool, 12 percent nylon and 4 percent spandex, for a soft, stretchy, comfortable fit. They’re 180 GSM (see our merino guide for exactly what GSM means), which makes them nice and light. The inseam here is 5.5 inches, and there’s no tag, which is nice.

    Image may contain: Bag, Backpack, Accessories, Handbag, and Baggage
    Courtesy: Unbound Merino

    Unbound

    Ultralight Travel Backpack

    $198 $185 (7% off)

    Unbound Merino

    Unbound recently branched out beyond merino clothing to create this travel backpack. I haven’t had a chance to thoroughly test this quite yet, but I’ve been using it for a couple of weeks and so far I’m impressed. This is a very well-thought-out pack that strikes a nice balance between included organization, and leaving enough space to let you do your own organizing. I particularly like the pen holder and the tech pouch. I also like that when you don’t need it, it lies admirably flat inside another bag. It’s surprisingly comfortable for its size. At 15L, this is not a huge pack, it’s designed to be a supplement to your main luggage with just enough room for everything you need for the day.

    Unbound Long-Sleeve Merino Crew shirt in green
    Photograph: Unbound

    Unbound

    Long-Sleeve Merino Crew

    $108 $98 (9% off)

    Unbound (Men’s)

    $98 $88 (10% off)

    Unbound (Women’s)

    I prefer the short sleeve T-shirts, but if you want a long sleeve, this is the T-shirt for you. It’s essentially Unbound’s short sleeve T-shirt, just long sleeve. All the same descriptions apply here, and many of the same multi-pack bundles are available. You can grab a 2-pack of long sleeve merino tees for $180 ($46 off).


    Power up with unlimited access to WIRED. Get best-in-class reporting and exclusive subscriber content that’s too important to ignore. Subscribe Today.


    Source: Wired.

  • Asus' new $4,000 RTX 5090 is already sold out — ROG Matrix Platinum's exorbitant price tag is no deterrent for well-heeled enthusiasts

    Asus' new $4,000 RTX 5090 is already sold out — ROG Matrix Platinum's exorbitant price tag is no deterrent for well-heeled enthusiasts

    November 24, 2025
    Hardware

    Top-shelf graphics cards have always commanded a substantial price premium, but some folks simply crave the best no matter the cost. Asus’ shiny ROG Matrix Platinum RTX 5090 is the company’s new halo card, and it’s coming in at a hefty $4,000. There’s just one small problem: You can’t get one anymore.

    Asus really made the Matrix an exclusive product, as it only produced 1,000 of these cards, and they’re reportedly sold out already. That’s a fairly impressive feat for a card that carries about a 42% price premium over the $2,800 that standard-issue RTX 5090s are currently going for. Given the regular cards are still available from several vendors, it’s safe to say the Matrix has quite the halo-product allure.

    It’s worth mentioning that even if you do have four grand burning a hole in your pocket, taking in and feeding the Matrix is quite the project. To make the most of its 800 W power limit, you’ll need a motherboard with a BTF graphics card power slot, which effectively means a higher-end Asus model. The card’s power delivery system can use either the BTF connector or a summery 12V-2×6 connector, but you’ll need both to unlock its full potential.

    German Youtuber der8auer has put the Matrix 5090 through its paces and pretty much confirmed Asus’ claims of a roughly 10% performance boost, provided you enable the 800 W power limit. Although 10% seems low, keep in mind we’re talking 10% over what is already a massive performance figure.

    In this age of diminishing returns on top-shelf hardware, it’s still mildly impressive, cost and practicality concerns aside. Der8auer did remark that he was not a fan of the card’s liquid metal application, pointing out that it would benefit from an area barrier to prevent it from potentially oozing out further than intended.

    The card’s cooling system is equally impressive, comprised of a massive heatsink and four fans in a 3+1 setup, in addition to the liquid metal TIM. The whole assembly reportedly weighs in at around 3.2 kg, or 7.1 lb. It’s also simply gigantic, at 370 x 150 x 77 mm, or 14.58 x 5.92 x 3.04 inches.

    A card this large is almost guaranteed to sag in time without support, and Asus fitted it with an angle sensor for an added layer of safety. Because no one wants broken hardware, especially after you just shelled out thousands for a GPU.

    Google Preferred Source

    Follow Tom’s Hardware on Google News, or add us as a preferred source, to get our latest news, analysis, & reviews in your feeds.

    Stay On the Cutting Edge: Get the Tom’s Hardware Newsletter

    Get Tom’s Hardware’s best news and in-depth reviews, straight to your inbox.


    Source: Latest from Tom’s Hardware.

  • Active vs. Passive ETF Flows, State Street on ETF Industy’s Future | ETF IQ 11/24/2025

    Active vs. Passive ETF Flows, State Street on ETF Industy’s Future | ETF IQ 11/24/2025

    November 24, 2025
    Business

    “Bloomberg ETF IQ” focuses on the opportunities, risks and current trends tied to the trillions of dollars in the global exchange traded funds industry. Today’s guests: Capital Group Head of Global Product Strategy and Development Holly Framsted, State Street Investment Management CEO Yie-Hsin Hung and HDGE ETF Co-Portfolio Manager Brad Lamensdorf. (Source: Bloomberg)


    Source: Bloomberg Markets.

Previous Page
1 … 56 57 58 59 60 … 911
Next Page
MONIMEGA
  • Instagram
  • Facebook
  • Twitter
Gestisci Consenso
Per fornire le migliori esperienze, utilizziamo tecnologie come i cookie per memorizzare e/o accedere alle informazioni del dispositivo. Il consenso a queste tecnologie ci permetterà di elaborare dati come il comportamento di navigazione o ID unici su questo sito. Non acconsentire o ritirare il consenso può influire negativamente su alcune caratteristiche e funzioni.
Funzionale Always active
L'archiviazione tecnica o l'accesso sono strettamente necessari al fine legittimo di consentire l'uso di un servizio specifico esplicitamente richiesto dall'abbonato o dall'utente, o al solo scopo di effettuare la trasmissione di una comunicazione su una rete di comunicazione elettronica.
Preferenze
L'archiviazione tecnica o l'accesso sono necessari per lo scopo legittimo di memorizzare le preferenze che non sono richieste dall'abbonato o dall'utente.
Statistiche
L'archiviazione tecnica o l'accesso che viene utilizzato esclusivamente per scopi statistici. L'archiviazione tecnica o l'accesso che viene utilizzato esclusivamente per scopi statistici anonimi. Senza un mandato di comparizione, una conformità volontaria da parte del vostro Fornitore di Servizi Internet, o ulteriori registrazioni da parte di terzi, le informazioni memorizzate o recuperate per questo scopo da sole non possono di solito essere utilizzate per l'identificazione.
Marketing
L'archiviazione tecnica o l'accesso sono necessari per creare profili di utenti per inviare pubblicità, o per tracciare l'utente su un sito web o su diversi siti web per scopi di marketing simili.
  • Manage options
  • Manage services
  • Manage {vendor_count} vendors
  • Read more about these purposes
Visualizza le preferenze
  • {title}
  • {title}
  • {title}