-
Sketch: A guided tour of Copenhagen
by: Geoff Graham Fri, 21 Nov 2025 18:53:05 +0000 Sketch is getting a massive UI overhaul, codenamed Copenhagen: Makes a lot of sense for an app that’s so tightly integrated to Mac to design around the macOS UI. Big Sur was a big update. Apple called it the biggest one since Mac OS X. So big, indeed, that they renamed Mac OS to macOS in the process. Now we have macOS Tahoe and while it isn’t billed the “biggest update since Big Sur” it does lean into an entirely new Liquid Glass aesthetic that many are calling the biggest design update to the Apple ecosystem since iOS 7. Sketch probably didn’t “have” to redesign its UI to line up with macOS Tahoe, but a big part of its appeal is the fact that it feels like it totally belongs to the Mac. It’s the same for Panic apps. The blog post I linked to sheds a good amount of light on the Sketch team’s approach to the updates. I came to the blog post to read about the attention they put into new features (individual page and frame link for the win!) and tightening up existing ones (that layer list looks nice), but what I really stayed for was their approach to Liquid Glass. Turns out they decided to respect it, but split lanes a bit: Spend a few seconds with an early prototype that leaned more heavily into Liquid Glass and it’s uber clear why a custom route was the best lane choice: Still taken from one of the blog post’s embedded videos Choosing a design editor can feel personal, can’t it? I know lots of folks are in the Figma Or Bust camp. Illustrator is still the favorite child for many, after all these… decades! There’s a lot of buzz around Affinity now that it’s totally free. I adopted Sketch a long time ago. How long? I dug up this dusty old blog post I wrote about Sketch 3 back in 2014, so at least 11 years. But I’m more of a transient in the design editor space. Being a contractor and all, I have to be open to any app my clients might use internally, regardless of my personal preference. I’d brush up on Sketch’s UI updates even if it wasn’t my go-to. Sketch: A guided tour of Copenhagen originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
Enshittification of Arduino Begins? Qualcomm Starts Clamping Down
by: Sourav Rudra Fri, 21 Nov 2025 10:34:13 GMT When Qualcomm announced its acquisition of Arduino in October 2025, the tinkerer and maker community watched nervously. Large corporate acquisitions rarely end well for open platforms after all, and enshittification is something that often follows. And now, what's followed is unsettling. Adafruit Industries, makers of popular development boards and a respected voice in the open hardware space, have sounded the alarm. This Looks ConcerningQualcomm has quietly made some massive changes to Arduino's Terms of Service and Privacy Policy, marking a clear departure from the platform's founding principles. According to Adafruit, the new policies introduce sweeping user-license provisions, broaden data collection (particularly around AI usage), and embed long-term account data retention, all while integrating user information into Qualcomm’s broader data ecosystem. Section 7.1 grants Arduino a perpetual, irrevocable license over anything you upload. Your code, projects, forum posts, and comments all fall under this. This remains in effect even after you delete your account. Arduino retains rights to your content indefinitely. The license is also royalty-free and sublicensable. Arduino can use your content however they want, distribute it, modify it, and even sublicense it to others. This is not unfounded; see for yourself.The terms further state that users are not allowed to reverse engineer or attempt to understand how the platform works unless Arduino gives permission. Adafruit argues that this contradicts the values that made Arduino attractive to educators, researchers, and hobbyists. The Privacy Policy states Arduino is wholly owned by Qualcomm Technologies, Inc. User data, including from minors, flows to other Qualcomm Group companies. While these policy changes have raised eyebrows, Qualcomm and Arduino maintain that the acquisition will not alter the core spirit of the platform. They also state that existing Arduino boards built on non-Qualcomm microcontrollers will continue to be supported. Nonetheless, there are good reasons to take Adafruit's concerns seriously. The updated Terms of Service and Privacy Policy do contain sweeping language that feels out of place for a platform built on openness and transparency. The community is entitled to scrutinize these changes closely. At the same time, the hardware side of Arduino doesn't seem to have changed too much as of now, so there's that too. Going forward, how these two organizations respond to criticisms such as this should paint a more clear picture of Arduino's future at its new home.
-
Move Between the Distros: Back Up and Restore Your Snap Packages
by: Roland Taylor Fri, 21 Nov 2025 04:43:20 GMT The Snap packaging system makes it easy to install and update software on any Linux distribution that supports them. However, if you’ve ever had to reinstall your system, you’ve probably been burned by the fact that Snap, like most other packaging systems, doesn’t provide any built-in means for exporting your apps or moving them to a new machine. Thankfully, there's good news: You can still. With just a few commands and a bit of organisation, you can export and restore your Snap applications on any other system where it's supported. 🚧 Some things to keep in mindBefore you dive in, there are some key things to understand about the Snap packaging system and how it works. Snap doesn’t yet have a built-in “export/import” tool like Flatpak. Neither packaging format allows you to repackage any packages you've already installed. Furthermore, with the Snap system, reinstalling restores the latest version of the package, not necessarily the exact revisions you previously had. Since many apps store extra data under /var/snap/, you'll likely need to restore this data as well, if you're seeking to retain your settings when migrating. This article will show you how you can back up and restore this directory as well. ⚠️ What this tutorial cannot coverOccasionally, Snap packages require hooks to enable certain features and integrations. Unfortunately, this is a more complicated process and must be done on a per-package basis. For this reason, we won't cover how to do this for individual packages, as that process can differ for each package that requires it. Now, let's dive in. Step 1. Creating a list of installed snap packagesTo get started, you'll first need to save a list of every Snap package currently installed on your system: snap list --all | awk 'NR>1 {print $1}' > snap-list.txt This will create a text file with the names of all your Snap packages. As with most other packaging systems, package names are all you need to refer to the packages you want to manage. However, if you'd keep a note of further details in this list, you can do so with the following command: snap list --all > snap-list-detailed.txt 🗒️Unlike with other packaging systems, you cannot restore particular revisions of an application with the Snap packaging system. This command is only useful for record keeping purpose.Step 2. Backing up your app dataSnap packages store their data and settings in your home folder within the ~/snap directory. Each app saves its data in a subdirectory of the same name. For example, Inkscape saves its data in /snap/inkscape Firefox in /snap/firefox, and so on. Each Snap package has its own config and data directoryYou can back up individual apps if you'd like, but for the purposes of this tutorial, we'll run through how to back up the entire directory. To do this, you can run: tar -czf snap-data-backup.tar.gz ~/snap/ Remember to copy this file along with snap-list.txt to the target system where you'll be restoring your packages. 🗒️If you're on a multi-user system, you'll need to run this for each user on the system you're transferring from.Step 3. Transferring to the target systemOn the target system, you should first ensure Snap is installed and working. For the best results, it's safest if the target system has the same or a newer version of Snap compared to the original. You can check the Snap version on both systems by running the following command: snap version If you get output showing your snap version and other data, you’re ready to go. 🗒️If you're running Ubuntu, Snap will be preinstalled. Most major distributions do not ship with Snap preinstalled, so you'll need to install it before continuing.Installing your packages on the target systemIn the same directory where you've copied the snap-list text file, run the following command to install the snap packages from your list: xargs -a snap-list.txt sudo snap install Once this command is finished running, you'll have all the same Snap apps and packages you'd have had on your previous system. Now, you can move on to restoring your app data. You can verify your apps successfully installed by running: snap list 4. Restoring app dataNow that you've successfully restored your Snap apps and packages, you can restore your Snap package data. To do this, you can decompress the archive you created earlier in your home folder: tar -xzf snap-data-backup.tar.gz -C ~/ Remember, if you've done this for multiple users, this will need to be done in each user's home folder individually. Optional bonus for advanced users: Automating your setupIf you regularly install or change your Snap packages, and you'd like to run this step more smoothly, you can automate it all with some simple scripting and cron. Creating the scriptFor the script, you just to tie these commands together. Create a file such as ~/bin/snap-back.sh, and give it executable permission: # Create the script: touch ~/bin/snap-back.sh # Give it executable permission: chmod +x ~/bin/snap-back.shNow edit the script with the text editor of your choice, and add the following: #!/bin/bash # Backup Snap package list and user data snap list --all | awk 'NR>1 {print $1}' > ~/snap-list.txt tar -czf ~/snap-data-backup.tar.gz ~/snap/ # Optional: enable logging echo "Snap backup completed on $(date)" >> ~/snap-backup.log If you don't need to keep a log, you can remove the last line (and the comment above it). Automating it allIf you'd like to have this back up run at regular intervals, you can schedule this process with cron: # Open your crontab crontab -eIn the editor, add this line: 0 10 * * SUN ~/bin/snap-back.shThis will set your Snap package backup to run automatically at the beginning of every week. You can choose any interval you'd prefer, of course. ConclusionEven though Snap doesn't offer the same level of convenience as Flatpak, these steps still give you a dependable and scriptable way to preserve and transfer your setup. This is especially useful if you love to maintain the same setup across devices or like to do a fresh installation on upgrade. Remember, you can always keep your setup synced to a version control system or your personal cloud server.
-
Should We Even Have :closed?
by: Sunkanmi Fafowora Thu, 20 Nov 2025 15:10:26 +0000 For the past few months, I’ve been writing a lot of entries on pseudo-selectors in CSS, like ::picker() or ::checkmark. And, in the process, I noticed I tend to use the :open pseudo-selector a lot in my examples — and in my work in general. Borrowing words from the fine author of the :open entry in the Almanac: So, given this: details:open { background: lightblue; color: darkred; } We expect that the <details> element gets a light blue background and dark red text when it is in an open state (everywhere but Safari at the time I’m writing this): CodePen Embed Fallback But what if we want to select the “closed” state instead? That’s what we have the:closed pseudo-class for, right? It’s supposed to match an element’s closed state. I say, supposed because it’s not specced yet. But does it need to be specced at all? I only ask because we can still target an element’s closed state without it using :not(): /* When details is _not_ open, but closed */ details:not(:open) { /* ... */ } So, again: do we really need a :closed pseudo-class? The answer may surprise you! (Just kidding, this isn’t that sort of article…) Some background Talks surrounding :open started in May 2022 when Mason Freed raised the issue of adding :open (which was also considered being named :top-layer at the time) to target elements in the top layer (like popups): Today, the OpenUI WC similarly resolved to add a :top-layer pseudo class that should apply to (at least) elements using the Popup API which are currently in the top layer. The intention for the naming and behavior, though, was that this pseudo class should also be general purpose. It should match any type of element in the top layer, including modal <dialog>, fullscreen elements, and ::backdrop pseudo elements. This sparked discourse on whether the name of the pseudo-element targeting the top layer of any type of element (e.g., popups, pickers, etc.) should either be :open or :top-layer. I, for one, was thrilled when the CSSWG eventually decided on :open in August 2022. The name makes a lot more sense to me because “open” assumes something in the top layer. To :close or :not(:open)? Hold on, though! In September that same year, Mason asked whether or not we should have something like a :closed pseudo-class to accompany :open. That way, we can match elements in their “closed” states just as we can their “open” states. That makes a lot of sense, t least on the surface. Tab Atkins chimed in: And guess what? Everyone seemed to agree. Why? Because it made sense at the time. I mean, since we have a pseudo-class that targets elements in their :open state, surely it makes sense to have :closed to target elements in their closed states, right? Right?? No. There’s actually an issue with that line of reasoning. Joey Arhar made a comment about it in October that same year: Wait, what happened to consensus? It’s the same question I raised at the top of this post. According to Luke Warlow: There is no :closed… for now Fast forward one more month to November 2024. A consensus was made to start out with just :open and remove :closed for the time being. Dang. Nevertheless, according to WHATWG and CSSWG, that decision could change in the future. In fact, Bramus dropped a useful note in there just a month before WHATWG made the decision: Just dropping this as an FYI: :read-only is defined as :not(:read-write), and that shipped. Which do you find easier to understand? Personally, I’m okay with :closed — or even using :not(:open) — so far as it works. In fact, I went ahead swapped :closed for :not(:open) in my ::checkmark and ::picker() examples. That’s why they are they way they are today. But! If you were to ask me which one comes easier to me on a typical day, I think I would say :closed. It’s easier for to think in literal terms than negated statements. What do you think, though? Would you prefer having :closed or just leaving it as :not(:open)? If you’re like me and you love following discussions like this, you can always head over to CSSWG drafts on GitHub to watch or participate in the fun. Should We Even Have :closed? originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
Deploy Your Thanksgiving Dinner with Cranberry sOSS
by: Sourav Rudra Thu, 20 Nov 2025 11:55:33 GMT There is an ongoing OSS maintainer burnout crisis. A new report reveals that a significant portion of developers have experienced burnout, with most of them being unpaid and very close to quitting. Luckily, all's not lost. With proper funding, support, and recognition, there is a chance this crisis can be handled. Alongside releasing that report, Sentry and the Open Source Pledge also announced something very wholesome. Celebrate Thanksgiving, The Open Source WayCranberry sOSS is a real jar of cranberry sauce that Vlad-Stefan Harbuz, Studio 404, and the Open Source Pledge team created to help open source maintainers. All proceeds made from this will go directly to developers. Funding distribution is handled systematically, with thank.dev's dependency analysis model being used to identify the most depended-upon open source maintainers globally. The complete list of beneficiaries is public on the funding distribution page. The creators acknowledge "no model is perfect". But they believe the weighted distribution approach makes sense for supporting foundational maintainers who keep the internet running. As for the sauce, it contains fresh cranberries sourced locally from Cape Cod. Other ingredients include organic cane sugar and water. It is gluten-free, sodium-free, and certified organic too. This can be a lovely addition to your Thanksgiving table in seven days; it should go well with sandwiches, charcuterie boards, and turkey dinners. Let the Celebrations BeginA jar of Cranberry sOSS costs $13.37 excluding shipping. You can order through the Sentry Shop. Cranberry sOSS ships internationally, though some countries are excluded, and thanks.dev handles all payment disbursement to the selected open source maintainers. PS: Keep an eye out for some genius copywriting on the product page. The pricing itself is an obvious one. Cranberry sOSSSuggested Read 📖 Open Source Developers Are Exhausted, Unpaid, and Ready to Walk AwayThe foundation of modern software is cracking under the weight of burnout.It's FOSSSourav Rudra
-
Blender 5.0 Released with HDR Support, Video Sequencer Overhaul, and ACES Workflows
by: Sourav Rudra Thu, 20 Nov 2025 08:32:58 GMT Blender is a free and open source 3D creation suite used across film, animation, game development, and VFX production. Organizations like Ubisoft, NVIDIA, AMD, and others rely on it for their commercial projects. With a recent announcement, the Blender team has released Blender 5.0, introducing major improvements to color management, video editing, and rendering workflows. 🆕 Blender 5.0: What's New?Blender 5.0 adds support for ACES 1.3 and 2.0 workflows. You can now use the ACEScg working space and ACES 2.0 view transforms. OpenEXR images can be saved in ACES2065-1 and ACEScg color spaces, with files now enabling custom working color spaces, like Linear Rec.2020. The Compositor also gets a new Convert Colorspace node, and tooltips now show descriptions for displays, views, and color spaces from your OpenColorIO config. The color pipeline now supports HDR and wide gamut colors for images and video. You get new display options like Rec.2100-PQ, Rec.2100-HLG, and AgX HDR. Using HDR on Blender requires a compatible monitor, Vulkan backend on Windows and Linux, and Wayland on Linux. Apple Silicon Macs work out of the box. Source: Blender Then there are the color pickers, which have a new Linear/Perceptual toggle, where the Linear option (formerly called RGB) uses the scene linear working color space and the Perceptual option uses the color picking space (sRGB by default) that matches the visual color picking widgets. Similarly, the Sky Texture node now uses multiple scattering for delivering more realistic skies and can be used to create day-to-night cycles by animating just a single parameter. The new Radial Tiling node allows you to create circular patterns and rounded polygons with adjustable roundness, and Grease Pencil objects now support motion blur with adjustable quality steps. We wrap up this section with the Video Sequencer getting a major overhaul. The Strip properties have been moved to the Properties Editor with dedicated tabs. You can now pick different scenes for the Sequencer, and the biggest addition here is the Compositor Modifier, which brings node-based effects into the Sequencer. Plus, playback controls are now built into the editor. 🛠️ Other Changes and ImprovementsThere are plenty of other quality-of-life upgrades too; some notable ones include: Better denoising quality with the OptiX denoiser.Metallic materials support thin-film iridescence effects like oil slicks.Material compilation is up to 4x faster on NVIDIA GPUs with Vulkan.Subsurface scattering now uses multi-bounce rendering for more realistic results.Volumes render faster with NanoVDB and new filtering (up to 3x speedup on GPU).📥 Download Blender 5.0You will find the necessary binaries for this release on the official website for Linux, Windows, and macOS. For alternative downloads on Linux, you get this release from Snapcraft and Steam. Though, before you download, you should take note of the updated GPU requirements, and for an in-depth look at Blender 5.0, you can go through the changelog. The source code lives in the project's Gitea instance. Blender 5.0
-
FOSS Weekly #25.47: AI Mode in Firefox, Nitrux 5, GNOME Panel, Rust Alternative Commands and More Linux Stuff
by: Abhishek Prakash Thu, 20 Nov 2025 03:31:34 GMT Nitrux has released a major new version, and it now uses Hyprland instead of KDE Plasma. Hyprland popularity is soaring, and I predict that more distros will start offering their Hyprland soon. Are we entering a Hyprland era of desktop Linux? Nitrux 5.0.0 Released: A ‘New Beginning’ That’s Not for Everyone (By Design)The Debian-based distro goes all-in on Hyprland, immutability, and intentional design.It's FOSSSourav RudraLet's see what else you get in this edition of FOSS Weekly: FFmpeg being unhappy with Google.Mastodon seeing a leadership change.Tool for keeping GNOME Panel clean.Snapchat dipping their toes in the open source pond.Video review of a beautiful Raspberry Pi mini PC case.And other Linux news, tips, and, of course, memes!This edition of FOSS Weekly is supported by Internxt. SPONSORED Free Webinar | SOC Leader’s Playbook: 3 Steps to Faster MTTR SOCs are dealing with tighter timelines, rising noise, and fast-moving threats. In this session, you’ll get a clear 3-step playbook designed to help teams: Cut MTTR by 21 minutesper incidentDetect new attacks earlierwith intel from15,000 organizationsAchieve a 3× performance boostby reducing false positives Tune in to the LIVE webinar on November 25 at 3 PM UTC 📰 Linux and Open Source NewsSnapchat open-sources the Valdi framework.RustDesk has pulled ahead of its competitors.FFmpeg has called out Google over CVE slop.IBM has joined the OpenSearch Software Foundation.Mozilla has unveiled a new 'AI Window' browsing mode for Firefox.Ubuntu now offers 15 years of support for long-lived enterprise systems.Eugen Rochko has stepped down from his role as CEO at Mastodon and looks forward to his new advisory role. After Nearly 10 Years of Building Mastodon, Eugen Rochko Steps Into Advisory RoleMastodon’s creator steps back from CEO role, transfers assets to non-profit organization.It's FOSSSourav Rudra🧠 What We’re Thinking AboutOpen source developers are burning out fast, and if concrete steps aren't taken, they will quit. Open Source Developers Are Exhausted, Unpaid, and Ready to Walk AwayThe foundation of modern software is cracking under the weight of burnout.It's FOSSSourav RudraMicrosoft's new AI feature for Windows can be tricked into installing malware. 🧮 Linux Tips, Tutorials, and LearningsSome suggestions to follow to keep your Linux systems secure.Ever heard the term "LUKS"? If not, then we have an explainer on it.Here are some Rust-based alternatives to classic CLI tools on Linux.If you see a 'apt-key is deprecated' warning, here's what you can do about it. [Fixed] apt-key is deprecated. Manage keyring files in trusted.gpg.dThe apt-key is being deprecated and your system knows that. But do you know what you should do to get packages from external repositories?It's FOSSAbhishek PrakashI mentioned Hyprland window manager at the beginning. On the related topic, here's an explainer on what a tiling window manager is. Explained: What is a Tiling Window Manager in Linux?Learn what a tiling window manager is, and the benefits that come along with it.It's FOSSAnkush Das Desktop Linux is mostly neglected by the industry but loved by the community. For the past 13 years, It's FOSS has been helping people use Linux on their personal computers. And we are now facing the existential threat from AI models stealing our content. If you like what we do and would love to support our work, please become It's FOSS Plus member. It costs $24 a year (less than the cost of a McDonald's burger a month), and you get an ad-free reading experience with the satisfaction of helping the desktop Linux community. Join It's FOSS Plus 👷 AI, Homelab and Hardware CornerYour Raspberry Pi Pico can be a DIY powerhouse with these project ideas. 9 Projects Ideas to Get into DIY Mode With Raspberry Pi PicoGot a Raspberry Pi Pico? Here are some examples of what you can do with this tiny but versatile microcontroller.It's FOSSAbhishek Kumar🛍️ Linux eBook bundleThis curated library (partner link) of courses includes Supercomputers for Linux SysAdmins, CompTIA Linux+ Certification Companion, Using and Administering Linux: Volumes 1–2, and more. Plus, your purchase supports the Room to Read initiative! Explore the Humble offer here✨ Project HighlightsVeil is a neat extension that can tidy up the top panel on GNOME-equipped systems. Clean Up Your GNOME Panel With This New ExtensionHide unwanted panel icons automatically with Veil.It's FOSSSourav Rudra📽️ Videos I Am Creating for YouA beautiful mini PC case for Raspberry Pi. The latest video shows its positives and negatives in action. Subscribe to It's FOSS YouTube Channel Linux is the most used operating system in the world. but on servers. Linux on desktop is often ignored. That's why It's FOSS made it a mission to write helpful tutorials and guides to help use Linux on their personal computer. We do it all for free. No venture capitalist funds us. But you know who does? Readers like you. Yes, we are an independent, reader supported publication helping Linux users worldwide with timely news coverage, in-depth guides and tutorials. If you believe in our work, please support us by getting a Plus membership. It costs just $3 a month or $99 for a lifetime subscription. Join It's FOSS Plus 💡 Quick Handy TipIn Firefox's recent versions (143 and above), you can copy and share links to highlight. Select a piece of text on a website you want to bring attention to, then right-click on the selection and click on "Copy Link to Highlight." 🎋 Fun in the FOSSverseThis crossword will test your knowledge of popular shortforms in FOSS. Expand the Short form: CrosswordIt’s time for you to solve a crossword!It's FOSSAnkush Das🤣 Meme of the Week: Yeah, visiting some Linux forums can be brutal, but not ours! 🗓️ Tech Trivia: On November 21, 1969, the first ARPANET link went live between UCLA and the Stanford Research Institute, demonstrating packet-switched communication and laying the groundwork for what would eventually become the modern Internet. 🧑🤝🧑 From the Community: One of our regular Pro FOSSers, Xander, is looking for solutions to backup only the Home folder in their Linux Mint system. Can you provide any helpful pointers? How to best make a backup of ONLY my home folder?Today I’m expecting a brand new computer. A Tuxedo computer. Now, on my current computer I’m running Linux Mint 22.2. How do I best backup my HOME directory completely, including all the dotfiles and dotdirectories. I’m especially interested in keeping my firefox configuration, but there’s also quite some documents on there I wish to keep. I’d either need to import it in TuxedoOS or a new install of Linux Mint, depending on how used I got to cinnamon.It's FOSS Communityxahodo❤️ With lovePlease share it with your Linux-using friends and encourage them to subscribe (hint: it's here). Share the articles in Linux Subreddits and community forums. Follow us on Google News and stay updated in your News feed. Opt for It's FOSS Plus membership and support us 🙏 Enjoy FOSS 😄
-
Microsoft's New Windows AI Feature Comes With Warnings About Malware and Data Theft
by: Sourav Rudra Wed, 19 Nov 2025 11:14:02 GMT If you ask me, Microsoft has been one of the biggest driving forces behind Linux adoption in recent years. The way they've been handling Windows, with its forced updates, aggressive telemetry, and questionable AI features, has sent more people to Linux than any marketing campaign ever could. And they are at it again with a new AI feature that could be tricked into installing malware on your system. Isn't This Too Much?Microsoft is rolling out a new experimental feature called "Copilot Actions" to Windows Insiders. They pitch it as an AI agent that handles tasks you describe to it. Organize vacation photos, sort your Downloads folder, extract info from PDFs, that sort of thing. It is currently available in Windows 11 Insider builds (version 26220.7262) as part of Copilot Labs and is off by default, requiring admin access to set it up. But here's the catch. Copilot Actions isn't just suggesting what to do. It runs in a separate environment called "Agent Workspace" with its unique user account, clicking through apps and working on your files. Microsoft says it has "capabilities like its own desktop" and can "interact with apps in parallel to your own session." And that's where the problems start. In a support document (linked above), Microsoft admits that features like Copilot Actions introduce "novel security risks." They warn about cross-prompt injection (XPIA), where malicious content in documents or UI elements can override the AI's instructions. The result? "Unintended actions like data exfiltration or malware installation." Yeah, you read that right. Microsoft is shipping a feature that could be tricked into installing malware on your system. Microsoft's own warning hits hard: "We recommend that you only enable this feature if you understand the security implications." When you try to enable these experimental features, Windows shows you a warning dialog that you have to acknowledge. 👇 Source: MicrosoftEven with these warnings, the level of access Copilot Actions demands is concerning. When you enable the feature, it gets read and write access to your Documents, Downloads, Desktop, Pictures, Videos, and Music folders. Windows Latest notes that, unlike Windows Sandbox, which runs in complete isolation and gets wiped clean when you close it, Copilot Actions operates in "Agent Workspace" with persistent user accounts that keep access to these folders across sessions. Also keep in mind that the feature can also access any apps installed for all users on a system. Microsoft says they are implementing safeguards. All actions are logged, users must approve data access requests, the feature operates in isolated workspaces, and the system uses audit logs to track activity. But you are still giving an AI system that can "hallucinate and produce unexpected outputs" (Microsoft's words, not mine) full access to your personal files. Closing ThoughtsThere is a pattern here. Microsoft seems obsessed with shoving AI into every corner of Windows, whether users want it or not, whether it's ready or not, while simultaneously playing around with the data of its users. This is why Linux keeps gaining traction. No AI experiments that could install malware, and no fighting against features you never asked for. Plus, the most likely way you will nuke your installation is if you deliberately run something like rm -rf yourself, not because Copilot got confused by a malicious PDF. If Microsoft's AI experiments are making you uncomfortable, then there are plenty of Linux distributions that respect your privacy and put you in control. Suggested Reads 📖 Best Linux Distributions For Everyone in 2025Looking for the best Linux distribution that suits everyone? Take a look at our comprehensive list.It's FOSSAnkush DasMicrosoft Recall Exposes Passwords and Banking Data!New tests reveal Microsoft Recall still screenshots sensitive data.It's FOSSSourav Rudra
-
After Nearly 10 Years of Building Mastodon, Eugen Rochko Steps Into Advisory Role
by: Sourav Rudra Wed, 19 Nov 2025 08:10:35 GMT Mastodon is a decentralized social network built on the ActivityPub protocol. Unlike Big Tech platforms, it operates as a federated network where users can choose or host their own servers. The key advantage is that no single entity controls your data or content. We already have an active presence on the instance owned and operated by the Mastodon non-profit, so you can follow us there if you have not already. Now let’s move on to the topic at hand. What's Happening: Eugen Rochko is stepping down as CEO after nearly ten years, transferring the trademark and other assets to the Mastodon non‑profit. He first announced the transition plan just two weeks into 2025, and after a series of quiet behind-the-scenes preparations, the change is now complete. Eugen goes on to explain his thinking behind the move: There are too many examples of founder egos sabotaging thriving communities, and while I’d like to think myself an exception, I understand why people would prefer better guardrails. But it would be uncouth for me to pretend that there isn’t some self-interest involved. Being in charge of a social media project is, turns out, quite the stressful endeavour, and I don’t have the right personality for it.He further elaborates on how the role has taken a toll on him, particularly the public visibility that comes with leading a social platform. Constant scrutiny, comparisons to tech billionaires, and the emotional weight of community expectations contributed to mounting stress. Over time, it was clear that continuing in such a prominent and demanding position was no longer healthy for him. What to Expect: According to TechCrunch, Mastodon is setting up a new Belgian AISBL (international non-profit association) to replace its former German gGmbH, which lost non-profit status last year. The Belgian structure offers more governance flexibility and international recognition. Meanwhile, a US-based 501(c)(3) non-profit currently holds the trademark and assets until the Belgian entity is established. Felix Hlatky is the new Executive Director, and the board includes Twitter co-founder Biz Stone, Karien Bezuidenhout, and Esra'a Al Shafei. Other members include Renaud Chaput as the Technical Director, Andy Piper as the Head of Communications, and Philip Schröpel as the Strategy & Product Advisor. Funding was secured from Jeff Atwood (€2.2 million), Biz Stone, AltStore (€260,000), GCC (€65,000), and Craigslist founder Craig Newmark. It is also worth noting that Eugen received €1 million in recognition of his years of service at a salary below market rates. And all of this makes sense. He built something bigger than himself and is now ensuring it remains that way. By handing control to a non-profit, he protects Mastodon’s values and frees himself to focus on building rather than managing all the noise that comes with the job. Suggested Read 📖 Mastodon: The Decentralized, Open Source Alternative to Twitter [to Resist Big Tech Monopoly]I don’t know about you, but I have long yearned for a social network that I can truly call home. Facebook is no good as it’s full of pictures of people’s cats and their dinner (probably not for me). Twitter is full of trolls and rude people,It's FOSSCommunity
-
Open Source Developers Are Exhausted, Unpaid, and Ready to Walk Away
by: Sourav Rudra Wed, 19 Nov 2025 05:42:55 GMT Your favorite apps run on code maintained by exhausted volunteers. The databases powering your company? Built by developers working double shifts. Those JavaScript frameworks everyone depends on? Often shepherded by a single person, unpaid, drowning in demands. A new report reveals just how bad things have gotten. Sentry funded this research through their Open Source Pledge initiative. Miranda Heath, a psychologist and PhD student at The University of Edinburgh, conducted the study. She reviewed academic literature, analyzed 57 community materials, and talked to seven OSS developers directly. Some had burned out. Others managed to avoid it. Some walked away entirely. Her findings track with open source infrastructure breaking down. The pressure points are nearly identical. Before we dive in, you have to know there is one major limitation with this report. Most analyzed materials came from white male developers. Miranda notes that marginalized groups likely experience additional burnout factors the research missed. Burnout in Open Source: A Structural Problem We Can Fix Together | Open Source PledgeBurnout is affecting the entire Open Source ecosystem. Here’s what we could do to make things better.Open Source PledgeThe Three Faces of BurnoutFirstly, you have to understand that burnout isn't just being tired. It has three distinct characteristics that feed off each other. The motivational component hits first. Developers lose the ability to push through tasks. What once felt manageable becomes impossible to start. They avoid work entirely. Then comes the affective breakdown. Emotional regulation fails. Developers become easily frustrated, irritated, and overwhelmed. They snap at users. They withdraw from communities. The cognitive shift follows. People mentally distance themselves from their work. They express negativity and cynicism towards it. Dark humor becomes a coping mechanism. "Fix it, fork it, f*ck off" becomes the phrase of choice. The numbers are brutal. A 2023 survey found 73% out of 26,348 developers experienced burnout at some point. Another survey showed 60% of OSS maintainers considered leaving entirely. Burnout is a predictor of quitting. When developers burn out, they walk away. Burnout is Slow DeathMiranda found six interconnected factors driving maintainers to the edge. Difficulty Getting Paid: Sixty percent of OSS maintainers receive no payment whatsoever (according to the Tidelift survey). They work full-time jobs, then maintain critical infrastructure for free. The double shift wrecks their mental and physical health and steals time from friends/family. Loneliness follows. Crushing Workload: Popular package maintainers drown in requests. They are often solo. Finding quality contributors is nearly impossible. Email overload alone can trigger burnout. Maintenance Feels Unrewarding: Developers love creating. They hate the repetitive, mind-numbing maintenance work. It takes time away from what they actually enjoy (coding). There is no creativity, no learning, just repetitive work. Toxic Community Behavior: Users demand features like customers. They shame maintainers publicly when bugs appear. Good work goes unrecognized. Mistakes get amplified. The entitlement exhausts them. Toxicity exists between developers too. The majority of OSS collaboration happens remotely. No face-to-face contact. No conflict resolution training. No formal support structures or governance unless teams build them. This makes team toxicity both more likely and harder to fix, and the isolation aspect only makes everything worse. Hyper-responsibility: Developers feel crushing obligation to their communities. They can't say no, and stepping back feels like betrayal. The guilt compounds the stress. Pressure to Prove Oneself: Developers need portfolios for jobs. They constantly prove themselves to the community and potential employers. The performance pressure never stops. Fear of losing reputation keeps them working past healthy limits. GitHub makes it worse. Achievements, badges, contribution graphs. It gamifies the work. Developers feel compelled to maintain streaks and numbers. The metrics become the measure of worth. These factors reinforce each other. No pay for OSS means working a full-time job on top of it. The double shift means longer hours. Longer hours kill patience. Less patience breeds toxicity. Toxicity drives contributors away. Fewer contributors means more work. What Needs to Change The report offers four clear recommendations. Pay OSS developers reliably. Not donations or tips. Predictable income through decentralized funding that preserves maintainer autonomy. Foster recognition and respect too. Community leaders must encourage better behavior, and platforms like GitHub should educate users about the humans behind the code. Grow the community through better education and mentorship programs. Make it easier for newcomers to contribute quality work. Financial support helps here too. And finally, advocate for maintainers. OSS powers critical infrastructure. Burnout puts that at risk. Advocacy bodies need to make governments aware. That awareness can bring funding and real solutions. And, I will be honest, this hits close to home. I fully understand what's happening. Burnout literally robs you of any motivation or energy to do the things you love. It doesn't just slow you down. It kills the joy entirely. The fix isn't complicated. Treat maintainers like the humans they are, not free infrastructure. Companies profiting from open source need to contribute financially (at the very least). Employers should give developers dedicated time for OSS work. Users must remember there is a person on the other end of that issue thread. Fellow developers need to call out toxicity when they see it. Burnout prevention starts with basic human decency. Suggested Read 📖 Open Source Infrastructure is Breaking Down Due to Corporate FreeloadingAn unprecedented threat looms over open source.It's FOSSSourav Rudra
-
417: Iframe Allow Attribute Saga
by: Chris Coyier Tue, 18 Nov 2025 23:11:32 +0000 There was a day not long ago where a Google Chrome browser update left any page with a CodePen Embed on it throwing a whole big pile of red JavaScript errors in the console. Not ideal, obviously. The change was related to how the browser handles allow attributes on iframes (i.e. <iframe allow="...">). CodePen was calculating the appropriate values inside an iframe for a nested iframe. That must have been a security issue of sorts, as now those values need to be present on the outside iframe as well. We documented all this in a blog post so hopefully we could get some attention from Chrome on this, and for other browser makers as well since it affects all of us. And I posted it on the ol’ social media: I think the patch is a great change so hats off to everyone involved for getting it done so quickly. It’s already in Canary and don’t really know when it’ll get the stable but that sure will be good. It follows how Safari is doing things where values that aren’t understood are just ignored (which we think is fine and inline with how HTML normally works). Fortunately we were able to mitigate the problem a little until then. For most Embedded Pens, a <script> is loaded on the page embedding it, and we dynamically create the <iframe> for you. This is just nice as it makes making an accessible fallback easier and gives you access to API-ish features for the embeds. We were able to augment that script to do a little browser user-agent sniffing and apply the correct set of allow attributes on the iframe, as to avoid those JavaScript errors we were seeing. But there’s the rub: we’d rather not do any user-agent sniffing at all. If we could just put all the possible allow attributes we want on there, and not be terribly concerned if any particular browser didn’t support any particular value, that would be ideal. We just can’t have the scary console errors, out of concern for our users who may not understand them. Where we’re at in the saga now is that: We’re waiting for the change to Chrome to get to stable. We’re hoping Safari stays the way it is. OH HI FIREFOX. On that last point, if we put all the allow attributes we would want to on an <iframe> in Firefox, we also get console-bombed. This time not with red-errors but with yellow-warnings. So yes, hi Firefox, if you could also not display these warnings (unless a reporting URL is set up) that would be great. We’d be one less website out there relying on user-agent sniffing.
-
RustDesk Pulls Ahead of TeamViewer, AnyDesk with Wayland Multi-Scaled Display Support
by: Sourav Rudra Tue, 18 Nov 2025 09:09:02 GMT RustDesk has positioned itself as a compelling open source alternative to proprietary remote desktop solutions like TeamViewer and AnyDesk. Built with Rust and licensed under AGPL 3.0, it offers cross-platform support across Linux, Android, Windows, macOS, and iOS. The project has now announced a major update for Linux users. RustDesk's latest nightly build introduces support for multiple monitors with different scaling factors on Wayland sessions, specifically targeting KDE and GNOME desktop environments. RustDesk Levels UpThis update addresses a well-known issue across the Linux desktop space, where users running multiple monitors with different resolutions and scaling levels, such as a 4K display at 200% scaling alongside a standard 1080p monitor, often struggled with proper display handling. The most common problem was pointer misalignment. Users would click in one location, but the input would register elsewhere on the remote machine. This made multi-monitor setups with mixed scaling practically unusable for remote work. The developers claim that their implementation now makes them the only remote desktop solution with this capability on Wayland. This puts RustDesk ahead of its commercial rivals. TeamViewer, AnyDesk, and Splashtop have been relatively slow to address Wayland-specific challenges, particularly around complex multi-monitor configurations. Get RustDeskThis improvement is currently available in RustDesk's nightly builds on GitHub. These pre-release versions get updated daily with the latest code and features for early testing. Once testing completes, the multi-scaled display support will roll out to the stable version available on the official website. We tested RustDesk back in 2024 and found it impressive even then. This latest update only solidifies its position as a serious TeamViewer alternative. RustDeskSuggested Read 📖 RustDesk: I Found This Open-Source TeamViewer Alternative Impressive!RustDesk is a fantastic secure remote desktop tool. Let’s take it for a spin!It's FOSSSourav Rudra
-
Chris’ Corner: Cursors
by: Chris Coyier Mon, 17 Nov 2025 18:00:37 +0000 CSS has a bunch of cursors already. Chances are, you’re not using them as much as you should be. Well, should is a strong word. I can’t cite any evidence offhand that special cursors is some absolute boon to user experience or accessibility. But it certainly seems like a nice touch. Like: .copy-button { cursor: copy; } Or [disabled] { cursor: not-allowed; } These cursors are actually supplied by your OS, and thus can be altered by the OS. That’s a good thing, as some OSs let you bump up the size of the cursor (with a url() value), for example, which is good for accessibility. You can set custom cursors as well, which won’t get bumped up, which is bad for accessibility. Looking around at our 2.0 Beta editor, I can see lots of CSS-provided cursor changes. I’m pretty pleased with those! An interesting aspect of “custom” cursors is that they are only obviously a problem if you replace the actual cursor itself. That doesn’t rule out doing things in addition or next to the cursor. Our own Rachel Smith’s site has rainbow paint splotches shoot out from behind the cursor, just for fun, but the cursor itself isn’t changed. Kyle Lambert has a good article about doing useful things with the cursor with a particular focus on things Figma does. Here’s some of excerpts of good ideas: Just interesting stuff! Not sure we’re seeing quite as much cursor innovation elsewhere.
-
The “Most Hated” CSS Feature: asin(), acos(), atan() and atan2()
by: Juan Diego Rodríguez Mon, 17 Nov 2025 14:47:54 +0000 This is a series! It all started a couple of articles ago, when we found out that, according to the State of CSS 2025 survey, trigonometric functions were the “Most Hated” CSS feature. I’ve been trying to change that perspective, so I showcased several uses for trigonometric functions in CSS: one for sin() and cos() and another on tan(). However, that’s only half of what trigonometric functions can do. So today, we’ll poke at the inverse world of trigonometric functions: asin(), acos(), atan() and atan2(). CSS Trigonometric Functions: The “Most Hated” CSS Feature sin() and cos() tan() asin(), acos(), atan() and atan2() (You are here!) Inverse functions? Recapping things a bit, given an angle, the sin(), cos() and tan() functions return a ratio presenting the sine, cosine, and tangent of that angle, respectively. And if you read the last two parts of the series, then you already know what each of those quantities represents. What if we wanted to go the other way around? If we have a ratio that represents the sine, cosine or tangent of an angle, how can we get the original angle? This is where inverse trigonometric functions come in! Each inverse function asks what the necessary angle is to get a given value for a specific trigonometric function; in other words, it undoes the original trigonometric function. So… acos() is the inverse of cos(), asin() is the inverse of sin(), and atan() and atan2() are the inverse of tan(). They are also called “arcus” functions and written as arcos(), arcsin() and arctan() in most places. This is because, in a circle, each angle corresponds to an arc in the circumference. CodePen Embed Fallback The length of this arc is the angle times the circle’s radius. Since trigonometric functions live in a unit circle, where the radius is equal to 1, the arc length is also the angle, expressed in radians. Their mathy definitions are a little boring, to say the least, but they are straightforward: y = acos(x) such that x = cos(y) y = asin(x) such that x = sin(y) y = atan(x) such that x = tan(y) acos() and asin() Using acos() and asin(), we can undo cos(θ) and sin(θ) to get the starting angle, θ. However, if we try to graph them, we’ll notice something odd: The functions are only defined from -1 to 1! Remember, cos() and sin() can take any angle, but they will always return a number between -1 and 1. For example, both cos(90°) and cos(270°) (not to mention others) return 0, so which value should acos(0) return? To answer this, both acos() and asin() have their domain (their input) and range (their output) restricted: acos() can only take numbers between -1 and 1 and return angles between 0° and 180°. asin() can only take numbers between -1 and 1 and return angles between -90° and 90°. This limits a lot of the situations where we can use acos() and asin(), since something like asin(1.2) doesn’t work in CSS* — according to the spec, going outside acos() and asin() domain returns NaN — which leads us to our next inverse function… atan() and atan2() Similarly, using atan(), we can undo tan(θ) to get θ. But, unlike asin() and acos(), if we graph it, we’ll notice a big difference: This time it is defined on the whole number line! This makes sense since tan() can return any number between -Infinity and Infinity, so atan() is defined in that domain. atan() can take any number between -Infinity and Infinity and returns angles -90° and 90°. This makes atan() incredibly useful to find angles in all kinds of situations, and a lot more versatile than acos() and asin(). That’s why we’ll be using it, along atan2(), going forward. Although don’t worry about atan2() for now, we’ll get to it later. Finding the perfect angle In the last article, we worked a lot with triangles. Specifically, we used the tan() function to find one of the sides of a right-angled triangle from the following relationships: To make it work, we needed to know one of its sides and the angle, and by solving the equation, we would get the other side. However, in most cases, we do know the lengths of the triangle’s sides and what we are actually looking for is the angle. In that case, the last equation becomes: Triangles and Conic Gradients Finding the angle comes in handy in lots of cases, like in gradients, for instance. In a linear gradient, for example, if we want it to go from corner to corner, we’ll have to match the gradient’s angle depending on the element’s dimensions. Otherwise, with a fixed angle, the gradient won’t change if the element gets resized: .gradient { background: repeating-linear-gradient(ghostwhite 0px 25px, darkslategray 25px 50px); } CodePen Embed Fallback This may be the desired look, but I think that most often than not, you want it to match the element’s dimensions. Using linear-gradient(), we can easily solve this using to top right or to bottom left values for the angle, which automatically sets the angle so the gradient goes from corner to corner. .gradient { background: repeating-linear-gradient(to top right, ghostwhite 0px 25px, darkslategray 25px 50px); } CodePen Embed Fallback However, we don’t have that type of syntax for other gradients, like a conic-gradient(). For example, the next conic gradient has a fixed angle and won’t change upon resizing the element. .gradient { background: conic-gradient(from 45deg, #84a59d 180deg, #f28482 180deg); } CodePen Embed Fallback Luckily, we can fix this using atan()! We can look at the gradient as a right-angled triangle, where the width is the adjacent side and the height the opposite side: Then, we can get the angle using this formula: .gradient { --angle: atan(var(--height-gradient) / var(--width-gradient)); } Since conic-gradient() starts from the top edge — conic-gradient(from 0deg) — we’ll have to shift it by 90deg to make it work. .gradient { --rotation: calc(90deg - var(--angle)); background: conic-gradient(from var(--rotation), #84a59d 180deg, #f28482 180deg); } CodePen Embed Fallback You may be wondering: can’t we do that with a linear gradient? And the answer is, yes! But this was just an example to showcase atan(). Let’s move on to more interesting stuff that’s unique to conic gradients. I got the next example from Ana Tudor’s post on “Variable Aspect Ratio Card With Conic Gradients”: CodePen Embed Fallback Pretty cool, right?. Sadly, Ana’s post is from 2021, a time when trigonometric functions were specced out but not implemented. As she mentions in her article, it wasn’t possible to create these gradients using atan(). Luckily, we live in the future! Let’s see how simple they become with trigonometry and CSS. We’ll use two conic gradients, each of them covering half of the card’s background. To save time, I’ll gloss over exactly how to make the original gradient, so here is a quick little step-by-step guide on how to make one of those gradients in a square-shaped element: CodePen Embed Fallback Since we’re working with a perfect square, we can fix the --angle and --rotation to be 45deg, but for a general use case, each of the conic-gradients would look like this in CSS: .gradient { background: /* one below */ conic-gradient( from var(--rotation) at bottom left, #b9eee1 calc(var(--angle) * 1 / 3), #79d3be calc(var(--angle) * 1 / 3) calc(var(--angle) * 2 / 3), #39b89a calc(var(--angle) * 2 / 3) calc(var(--angle) * 3 / 3), transparent var(--angle) ), /* one above */ conic-gradient( from calc(var(--rotation) + 180deg) at top right, #fec9d7 calc(var(--angle) * 1 / 3), #ff91ad calc(var(--angle) * 1 / 3) calc(var(--angle) * 2 / 3), #ff5883 calc(var(--angle) * 2 / 3) calc(var(--angle) * 3 / 3), transparent var(--angle) ); } And we can get those --angle and --rotation variables the same way we did earlier — using atan(), of course! .gradient { --angle: atan(var(--height-gradient) / var(--width-gradient)); --rotation: calc(90deg - var(--angle)); } CodePen Embed Fallback What about atan2()? The last example was all abou atan(), but I told you we would also look at the atan2() function. With atan(), we get the angle when we divide the opposite side by the adjacent side and pass that value as the argument. On the flip side, atan2() takes them as separate arguments: atan(opposite/adjacent) atan2(opposite, adjacent) What’s the difference? To explain, let’s backtrack a bit. We used atan() in the context of triangles, meaning that the adjacent and opposite sides were always positive. This may seem like an obvious thing since lengths are always positive, but we won’t always work with lengths. Imagine we are in a x-y plane and pick a random point on the graph. Just by looking at its position, we can know its x and y coordinates, which can have both negative and positive coordinates. What if we wanted its angle instead? Measuring it, of course, from the positive x-axis. Well, remember from the last article in this series that we can also define tan() as the quotient between sin() and cos(): Also recall that when we measure the angle from the positive x-axis, then sin() returns the y-coordinate and cos() returns the x-coordinate. So, the last formula becomes: And applying atan(), we can directly get the angle! This formula has one problem, though. It should work for any point in the x-y plane, and since both x and y can be negative, we can confuse some points. Since we are dividing the y-coordinate by the x-coordinate, in the eyes of atan(), the negative y-coordinate looks the same as the negative x-coordinate. And if both coordinates are negative, it would look the same as if both were positive. To compensate for this, we have atan2(), and since it takes the y-coordinate and x-coordinate as separate arguments, it’s smart enough to return the angle everywhere in the plane! Let’s see how we can put it to practical use. Following the mouse Using atan2(), we can make elements react to the mouse’s position. Why would we want to do that? Meet my friend Helpy, Clippy’s uglier brother from Microsoft. CodePen Embed Fallback Helpy wants to always be looking at the user’s mouse, and luckily, we can help him using atan2(). I won’t go into too much detail about how Helpy is made, just know that his eyes are two pseudo-elements: .helpy::before, .helpy::after { /* eye styling */ } To help Helpy, we first need to let CSS know the mouse’s current x-y coordinates. And while I may not like using JavaScript here, it’s needed in order to pass the mouse coordinates to CSS as two custom properties that we’ll call --m-x and --m-y. const body = document.querySelector("body"); // listen for the mouse pointer body.addEventListener("pointermove", (event) => { // set variables for the pointer's current coordinates let x = event.clientX; let y = event.clientY; // assign those coordinates to CSS custom properties in pixel units body.style.setProperty("--m-x", `${Math.round(x)}px`); body.style.setProperty("--m-y", `${Math.round(y)}px`); }); Helpy is currently looking away from the content, so we’ll first move his eyes so they align with the positive x-axis, i.e., to the right. .helpy::before, .helpy::after { rotate: 135deg; } Once there, we can use atan2() to find the exact angle Helpy has to turn so he sees the user’s mouse. Since Helpy is positioned at the top-left corner of the page, and the x and y coordinates are measured from there, it’s time to plug those coordinates into our function: atan2(var(--m-y), var(--m-x)). .helpy::before, .helpy::after { /* rotate the eyes by it's starting position, plus the atan2 of the coordinates */ rotate: calc(135deg + atan2(var(--m-y), var(--m-x))); } We can make one last improvement. You’ll notice that if the mouse goes on the little gap behind Helpy, he is unable to look at the pointer. This happens because we are measuring the coordinates exactly from the top-left corner, and Helpy is positioned a little bit away from that. To fix this, we can translate the origin of the coordinate system directly on Helpy by subtracting the padding and half its size: Which looks like this in CSS: .helpy::before, .helpy::after { rotate: calc( 135deg + atan2( var(--m-y) - var(--spacing) - var(--helpy-size) / 2, var(--m-x) - var(--spacing) - var(--helpy-size) / 2 ) ); } CodePen Embed Fallback This is a somewhat minor improvement, but moving the coordinate origin will be vital if we want to place Helpy in any other place on the screen. Extra: Getting the viewport (and anything) in numbers I can’t finish this series without mentioning a trick to typecast different units into simple numbers using atan2() and tan(). It isn’t directly related to trigonometry but it’s still super useful. It was first described amazingly by Jane Ori in 2023, and goes as follows. If we want to get the viewport as an integer, then we can… @property --100vw { syntax: "<length>;"; initial-value: 0px; inherits: false; } :root { --100vw: 100vw; --int-width: calc(10000 * tan(atan2(var(--100vw), 10000px))); } And now: the --int-width variable holds the viewport width as an integer. This looks like magic, so I really recommend reading Jane Ori’s post to understand it. I also have an article using it to create animations as the viewport is resized! CodePen Embed Fallback What about reciprocals? I noticed that we are still lacking the reciprocals for each trigonometric function. The reciprocals are merely 1 divided by the function, so there’s a total of three of them: The secant, or sec(x), is the reciprocal of cos(x), so it’s 1 / cos(x). The cosecant, or csc(x), is the reciprocal of sin(x), so it’s 1 / sin(x). The cotangent, or cot(x) is the reciprocal of tan(x), so it’s 1 / tan(x). The beauty of sin(), cos() and tan() and their reciprocals is that they all live in the unit circle we’ve looked at in other articles in this series. I decided to put everything together in the following demo that shows all of the trigonometric functions covered on the same unit circle: CodePen Embed Fallback That’s it! Welp, that’s it! I hope you learned and had fun with this series just as much as I enjoyed writing it. And thanks so much for those of you who have shared your own demos. I’ll be rounding them up in my Bluesky page. CSS Trigonometric Functions: The “Most Hated” CSS Feature sin() and cos() tan() asin(), acos(), atan() and atan2() (You are here!) The “Most Hated” CSS Feature: asin(), acos(), atan() and atan2() originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
Clean Up Your GNOME Panel With This New Extension
by: Sourav Rudra Mon, 17 Nov 2025 12:49:10 GMT I rely heavily on GNOME extensions for my daily workflow. From Dash to Dock for quick app launching to Tiling Shell to effortlessly manage app windows while working. These basically turn the vanilla GNOME experience into something that truly fits my needs. While browsing through the latest This Week in GNOME post, I stumbled upon something interesting. A developer announced Veil, describing it as a cleaner and more modern way than Hide Items to manage applets in the GNOME panel. It sounded promising. So I decided to take it for a spin and see what it brings to the table. Veil: Overview ⭐ Veil comes from Dagim G. Astatkie, a software professional based out of Ethiopia. This extension addresses a common frustration among GNOME users. If you are a power user, then your top panel can quickly fill up with system indicators and status icons. It gets messy fast, and Veil gives you control over what stays visible and what gets hidden away. It offers many handy features, like auto-hide items on timer, slick animations when showing or hiding items, and the ability to selectively choose which panel icons stay visible. Initial Impressions 👨💻I installed it using Extension Manager on a Ubuntu 25.10 system, and I found it straightforward from start to finish. First, I enabled a few other extensions to properly test how Veil handles multiple panel items. Once that was done, everything clicked into place. A single click on the sharp-looking arrow at the top right of the panel did the trick. My network stats indicator disappeared. The Tiling Shell layout switcher vanished. System Monitor went away too. A clean top panel, just like that. Veil's General and Panel Items page. If I wanted to tweak things further, I could easily do so by heading into the "General" tab of the extension settings. There I got to play around with options like save state, default visibility, changing the arrow icon to something else for open and close actions, configuring auto-hide timing, and deciding which items stay visible at all times. This level of freedom should be enough for most people who want a clean top panel and some peace of mind. 📥 Get VeilIf you already have GNOME extensions set up on your system, installation is straightforward. Visit the extensions website or open Extension Manager and search for "Veil" by author "JD". If you haven't configured extensions yet, our complete guide on GNOME shell extensions will walk you through the entire setup process. The source code for Veil lives on GitHub for those interested in contributing or building from source. VeilSuggested Read 📖 How to Use GNOME Shell Extensions [Complete Guide]Step-by-step detailed guide to show you how to install GNOME Shell Extensions manually or easily via a browser.It's FOSSAbhishek Prakash