
Everything posted by Blogger
-
Maybe don’t use custom properties in shorthand properties
by: Geoff Graham Thu, 06 Mar 2025 16:33:55 +0000 Manuel Matuzović: This easily qualifies as a “gotcha” in CSS and is a good reminder that the cascade doesn’t know everything all at the same time. If a custom property is invalid, the cascade won’t ignore it, and it gets evaluated, which invalidates the declaration. And if we set an invalid custom property on a shorthand property that combines several constituent properties — like how background and animation are both shorthand for a bunch of other properties — then the entire declaration becomes invalid, including all of the implied constituents. No bueno indeed. What to do, then? Great advice, Manuel! Maybe don’t use custom properties in shorthand properties originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
FOSS Weekly #25.10: Skype is Dead, GNOME 48 Features, Ubuntu Versions, Nano Guide and More Linux Stuff
by: Abhishek Prakash Thu, 06 Mar 2025 05:27:13 GMT Skype is being discontinued by Microsoft on 5th May. Once a hallmark of the old internet, Skype was already dying a slow death. It just could not keep up with the competition from WhatsApp, Zoom etc despite Microsoft's backing. While there are open source alternatives to Skype, I doubt if friends and family would use them. I am not going to miss it, as I haven't used Skype in years. Let's keep it in the museum of Internet history. Speaking of the old internet, Digg is making a comeback. 20 years back, it was the 'front page of the internet'. 💬 Let's see what else you get in this edition VLC aiming for the Moon.EA open sourcing its games.GNOME 48 features to expect.And other Linux news, tips, and, of course, memes!This edition of FOSS Weekly is supported by ONLYOFFICE.✨ ONLYOFFICE PDF Editor: Create, Edit and Collaborate on PDFs on LinuxThe ONLYOFFICE suite now offers an updated PDF editor that comes equipped with collaborative PDF editing and other useful features. You can deploy ONLYOFFICE Docs on your Linux server and integrate it with your favourite platform, such as Nextcloud, Moodle and more. Alternatively, you can download the free desktop app for your Linux distro. Online PDF editor, reader and converter | ONLYOFFICEView and create PDF files from any text document, spreadsheet or presentation, convert PDF to DOCX online, create fillable PDF forms.ONLYOFFICE📰 Linux and Open Source NewsElectronic Arts has open sourced four Command & Conquer games.VLC is literally reaching for the Moon to mark its 20-year anniversary.Internxt Drive has become the first cloud storage with post-quantum encryption.Electronic Frontier Foundation has launched a new open source tool to detect eavesdropping on cellular networks.GNOME 48 is just around the corner, check out what features are coming: Discover What’s New in GNOME 48 With Our Feature Rundown!GNOME 48 is just around the corner. Explore what’s coming with it.It's FOSS NewsSourav Rudra🧠 What We’re Thinking AboutA German startup has published open source plans for its Nuclear Fusion power plant! As per the latest desktop market share report, macOS usage has seen a notable dip on Steam. 🧮 Linux Tips, Tutorials and MoreGet the 'Create new document' option back in the right-click context menu in GNOME.Facing errors while trying to watch a DVD on Fedora? It can be fixed.Learn to record a selected area or an application window with OBS Studio.Knowing how to edit files with Nano text editor, might come in handy while dealing with config files.New users often get confused with so many Ubuntu versions. This article helps clear the doubt. Explained: Which Ubuntu Version Should I Use?Confused about Ubuntu vs Xubuntu vs Lubuntu vs Kubuntu?? Want to know which Ubuntu flavor you should use? This beginner’s guide helps you decide which Ubuntu should you choose.It's FOSSAbhishek Prakash👷 Homelab and Maker's CornerAs a Kodi user, you cannot miss out on installing add-ons and builds. We also have a list of the best add-ons to spice up your media server. And you can use virtual keyboard with Raspberry Pi easily. Using On-screen Keyboard in Raspberry Pi OSHere’s what you can do to use a virtual keyboard on Raspberry Pi OS.It's FOSSAbhishek Prakash✨ Apps HighlightFacing slow downloads on your Android smartphone? Aria2App can help. Aria2App is a Super Fast Versatile Open-Source Download Manager for AndroidA useful open-source download manager for AndroidIt's FOSS NewsSourav Rudralichess lets you compete with other players in online games of Chess. 📽️ Video I am Creating for YouHow much does an active cooler cools down a Raspberry Pi 5? Let's find it out in this quick video. Subscribe to It's FOSS YouTube Channel🧩 Quiz TimeFor a change, you can take the text processing command crossword challenge. Commands to Work With Text Files: CrosswordSolve this crossword with commands for text processing.It's FOSSAnkush Das💡 Quick Handy TipYou can play Lofi music in VLC Media Player. First, switch to the Playlist view in VLC by going into View → Playlist. Now, in the sidebar, scroll down and select Icecast Radio Directory. Here, search for Lofi in the search bar. Now, double-click on any Lo-fi channel to start playing. On the other hand, if you want to listen to music via the web browser, you can use freeCodeCamp.org Code Radio. 🤣 Meme of the WeekYou didn't have to join the dark side, Firefox. 🫤 🗓️ Tech TriviaIn 1953, MIT's Whirlwind computer showcased an early form of system management software called "Director," developed by Douglas Ross. Demonstrated at a digital fire control symposium, Director automated resource allocation (like memory, storage, and printing), making it one of the earliest examples of an operating system-like program. 🧑🤝🧑 FOSSverse CornerAn important question has been raised by one of our longtime FOSSers. Do we all see the same thing on the internet?I think we all assume we are seeing the same content on a website. But do we.? Read this quote from an article on the Australian ABC news “Many people are unaware that the internet they see is unique to them. Even if we surf the same news websites, we’ll see different news stories based on our previous likes. And on a website like Amazon, almost every item and price we see is unique to us. It is chosen by algorithms based on what we were previously wanting to buy and willing to pay. There is…It's FOSS Communitynevj❤️ With loveShare 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 😄
-
Record Windows and Cropped Area in OBS Studio
by: Sreenath Thu, 06 Mar 2025 03:09:13 GMT When it comes to screen recording in Linux or any other operating system, OBS Studio becomes he go-to choice. It offers all the features baked in for users, ranging from casual screen recorders to advanced streamers. One such useful feature is to record a part of the screen in OBS Studio. I'll share the detailed steps for Linux users in this tutorial. 🚧The method mentioned is based on a Wayland session. Also, this is a personal workflow, and if readers have better options, feel free to comment, so that I can improve the article for everyone.Record an application window in OBS StudioBefore starting, first click on File → Settings from OBS Studio main menu. Here, in the Settings window, go to the Video section and note the Canvas resolution and Output scale resolution for your system. Note Canvas and Output Scale valuesThis will be helpful when you are reverting in a later step. Step 1: Create a new sourceFirst, let's create a new source for our recording. Click on the “+” icon on the OBS Studio home screen as shown in the screenshot below. Select “Screen Capture (Pipewire)” option. 📋For X11 system, this may be Display Capture (XSHM).Click on "+" to add a new sourceOn the resulting window, give a name to the source and then click OK. Give a name to the sourceOnce you press OK, you will be shown a dialog box to select the record area. Step 2: Select the window to recordHere, select the Window option from the top bar. Select the window to be recorded.Once you click on the Window option, you will be able to see all the open windows listed. Select a window that you want to record from the list, as shown in the screenshot above. This will give you a dialog box, with a preview of the window being recorded. Enable the cursor recording (if needed) and click OK. Selected window in previewStep 3: Crop the video to window sizeNow, in the main OBS window, you can see that the application you have selected is not filling the full canvas, in my case 1920×1080. Empty space in canvasThe output will contain this window and the rest of the canvas in black if you keep recording with this setting. You need to crop the area so that only the necessary part is present on the output file. For this, right-click on our source and select Resize Output (Source Size) option, as shown below: Resize output source sizeClick on Yes, when prompted. Accept ConfirmationAs soon as you click Yes, you can see that the canvas is now reduced to the size of the window. Canvas ResizedStep 4: Record the videoYou can now start recording the video using the Record button. Start video recordingOnce finished, stop recording, and the saved video file won't contain any other part, except the window. Step 5: Delete the video sourceNow that you have recorded the video, let's remove this particular source. Right-click on the source and select Remove. Remove the sourceStep 6: Revert the canvas and output scaleWhile we were resizing the canvas to the window, the setting has been also changed on your OBS Studio video settings. If left unchanged, your future videos will also be recorded with the reduced size. So, click on File in the OBS Studio main menu and select Settings. Click on File → SettingsOn the Settings window, go to Videos and revert the Base Canvas Resolution and Output Scaled Resolution to your preferred normal values. Then click Apply. Revert Canvas Size to normalRecord an area on the screen in OBS StudioThis is the same process as the one described above, except for the area selection. Step 1: Create a new sourceClick on the plus button on the Sources section in OBS Studio and select Screen Capture. Select Screen CaptureName the source and click OK. Step 2: Select a regionOn the area selection dialog box, click on Region. From the section, select Select Region option. Select RegionNotice the cursor has now changed to a plus sign. Drag the area you want to record. Select Area to RecordYou can see that the preview now has the selected area. Don't forget to enable the cursors, if needed. It is normal that the canvas is way too big and your video occupies only a part of it. Canvas Size MismatchStep 3: Resize the sourceLike in the previous section, right-click on the source and select Resize output option. Resize Output to Area CaptureStep 4: Record and revert the settingsStart recording the video. Once it is completed, save the recording and remove the source. Revert the canvas and output scale settings, as shown in step 6 of the previous section. 💬 Hope this guide has helped you record with OBS Studio. Please let me know if this tutorial helped you or if you need further help.
-
Whereis Command Examples
by: Abhishek Prakash Wed, 05 Mar 2025 20:45:06 +0530 The whereis command helps users locate the binary, source, and manual page files for a given command. And in this tutorial, I will walk you through practical examples to help you understand how to use whereis command. Unlike other search commands like find that scan the entire file system, whereis searches predefined directories, making it faster and more efficient. It is particularly useful for system administrators and developers to locate files related to commands without requiring root privileges. whereis Command SyntaxTo use any command to its maximum potential, it is important to know its syntax and that is why I'm starting this tutorial by introducing the syntax of the whereis command: whereis [OPTIONS] FILE_NAME...Here, OPTIONS: Flags that modify the search behavior.FILE_NAME: The name of the file or command to locate.Now, let's take a look at available options of the whereis command: Flag Description -b Search only for binary files. -s Search only for source files. -m Search only for manual pages. -u Search for unusual files (files missing one or more of binary, source, or manual). -B Specify directories to search for binary files (must be followed by -f). -S Specify directories to search for source files (must be followed by -f). -M Specify directories to search for manual pages (must be followed by -f). -f Terminate directory lists provided with -B, -S, or -M, signaling the start of file names. -l Display directories that are searched by default. 1. Locate all files related to a commandTo find all files (binary, source, and manual) related to a command, all you have to do is append the command name to the whereis command as shown here: whereis commandFor example, if I want to locate all files related to bash, then I would use the following: whereis bashHere, /usr/bin/bash: Path to the binary file./usr/share/man/man1/bash.1.gz: Path to the manual page.2. Search for binary files onlyTo locate only the binary (executable) file of a command, use the -b flag along with the target command as shown here: whereis -b commandIf I want to search for the binary files for the ls command, then I would use the following: whereis -b ls3. Search for the manual page onlyTo locate only the manual page for a specific command, use the -m flag along with the targeted command as shown here: whereis -m commandFor example, if I want to search for the manual page location for the grep command, then I would use the following: whereis -m grepAs you can see, it gave me two locations: /usr/share/man/man1/grep.1.gz: A manual page which can be accessed through man grep command. /usr/share/info/grep.info.gz: An info page that can be accessed through info grep command. 4. Search for source files onlyTo find only source code files associated with a command, use the -s flag along with the targeted command as shown here: whereis -s commandFor example, if I want to search source files for the gcc, then I would use the following: whereis -s gccMy system is fresh and I haven't installed any packages from the source so I was given a blank output. 5. Specify custom directories for searching To limit your search to specific directories, use options like -B, -S, or -M. For example, if I want to limit my search to the /bin directory for the cp command, then I would use the following command: whereis -b -B /bin -f cpHere, -b: This flag tells whereis to search only for binary files (executables), ignoring source and manual files.-B /bin: The -B flag specifies a custom directory (/bin in this case) where whereis should look for binary files. It also limits the search to the /bin directory instead of searching all default directories.-f cp: Without -f, the whereis command would interpret cp as another directory.6. Identify commands missing certain files (unusual files)The whereis command can help you find commands that are missing one or more associated files (binary, source, or manual). This is particularly useful for troubleshooting or verifying file completeness. For example, to search for commands in the /bin directory that is missing manual pages, you first have to change your directory to /bin and then use the -u flag to search for unusual files: cd /bin whereis -u -m *Wrapping Up...This was a quick tutorial on how you can use the whereis command in Linux including practical examples and syntax. I hope you will find this guide helpful. If you have any queries or suggestions, leave us a comment.
-
Grouping Selection List Items Together With CSS Grid
by: Preethi Wed, 05 Mar 2025 13:16:32 +0000 Grouping selected items is a design choice often employed to help users quickly grasp which items are selected and unselected. For instance, checked-off items move up the list in to-do lists, allowing users to focus on the remaining tasks when they revisit the list. We’ll design a UI that follows a similar grouping pattern. Instead of simply rearranging the list of selected items, we’ll also lay them out horizontally using CSS Grid. This further distinguishes between the selected and unselected items. We’ll explore two approaches for this. One involves using auto-fill, which is suitable when the selected items don’t exceed the grid container’s boundaries, ensuring a stable layout. In contrast, CSS Grid’s span keyword provides another approach that offers greater flexibility. The HTML is the same for both methods: <ul> <li> <label> <input type="checkbox" /> <div class=icon>🍱</div> <div class=text>Bento</div> </label> </li> <li> <label> <input type="checkbox" /> <div class=icon>🍡</div> <div class=text>Dangos</div> </label> </li> <!-- more list items --> </ul> The markup consists of an unordered list (<ul>). However, we don’t necessarily have to use <ul> and <li> elements since the layout of the items will be determined by the CSS grid properties. Note that I am using an implicit <label> around the <input> elements mostly as a way to avoid needing an extra wrapper around things, but that explicit labels are generally better supported by assistive technologies. Method 1: Using auto-fill CodePen Embed Fallback ul { width: 250px; display: grid; gap: 14px 10px; grid-template-columns: repeat(auto-fill, 40px); justify-content: center; /* etc. */ } The <ul> element, which contains the items, has a display: grid style rule, turning it into a grid container. It also has gaps of 14px and 10px between its grid rows and columns. The grid content is justified (inline alignment) to center. The grid-template-columns property specifies how column tracks will be sized in the grid. Initially, all items will be in a single column. However, when items are selected, they will be moved to the first row, and each selected item will be in its own column. The key part of this declaration is the auto-fill value. The auto-fill value is added where the repeat count goes in the repeat() function. This ensures the columns repeat, with each column’s track sizing being the given size in repeat() (40px in our example), that will fit inside the grid container’s boundaries. For now, let’s make sure that the list items are positioned in a single column: li { width: inherit; grid-column: 1; /* Equivalent to: grid-column-start: 1; grid-column-end: auto; */ /* etc. */ } When an item is checked, that is when an <li> element :has() a :checked checkbox, we’re selecting that. And when we do, the <li> is given a grid-area that puts it in the first row, and its column will be auto-placed within the grid in the first row as per the value of the grid-template-columns property of the grid container (<ul>). This causes the selected items to group at the top of the list and be arranged horizontally: li { width: inherit; grid-column: 1; /* etc. */ &:has(:checked) { grid-area: 1; /* Equivalent to: grid-row-start: 1; grid-column-start: auto; grid-row-end: auto; grid-column-end: auto; */ width: 40px; /* etc. */ } /* etc. */ } And that gives us our final result! Let’s compare that with the second method I want to show you. Method 2: Using the span keyword CodePen Embed Fallback We won’t be needing the grid-template-columns property now. Here’s the new <ul> style ruleset: ul { width: 250px; display: grid; gap: 14px 10px; justify-content: center; justify-items: center; /* etc. */ } The inclusion of justify-items will help with the alignment of grid items as we’ll see in a moment. Here are the updated styles for the <li> element: li { width: inherit; grid-column: 1 / span 6; /* Equivalent to: grid-column-start: 1; grid-column-end: span 6; */ /* etc. */ } As before, each item is placed in the first column, but now they also span six column tracks (since there are six items). This ensures that when multiple columns appear in the grid, as items are selected, the following unselected items remain in a single column under the selected items — now the unselected items span across multiple column tracks. The justify-items: center declaration will keep the items aligned to the center. li { width: inherit; grid-column: 1 / span 6; /* etc. */ &:has(:checked) { grid-area: 1; width: 120px; /* etc. */ } /* etc. */ } The width of the selected items has been increased from the previous example, so the layout of the selection UI can be viewed for when the selected items overflow the container. Selection order The order of selected and unselected items will remain the same as the source order. If the on-screen order needs to match the user’s selection, dynamically assign an incremental order value to the items as they are selected. onload = ()=>{ let i=1; document.querySelectorAll('input').forEach((input)=>{ input.addEventListener("click", () => { input.parentElement.parentElement.style.order = input.checked ? i++ : (i--, 0); }); }); } CodePen Embed Fallback Wrapping up CSS Grid helps make both approaches very flexible without a ton of configuration. By using auto-fill to place items on either axis (rows or columns), the selected items can be easily grouped within the grid container without disturbing the layout of the unselected items in the same container, for as long as the selected items don’t overflow the container. If they do overflow the container, using the span approach helps maintain the layout irrespective of how long the group of selected items gets in a given axis. Some design alternatives for the UI are grouping the selected items at the end of the list, or swapping the horizontal and vertical structure. Grouping Selection List Items Together With CSS Grid originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
QuestionAI
by: aiparabellum.com Wed, 05 Mar 2025 08:08:08 +0000 QuestionAI represents the next evolution in question-answering technology, bridging the gap between vast information repositories and human curiosity. Unlike traditional search engines that return lists of potentially relevant links, QuestionAI directly delivers concise, accurate answers drawn from analyzing multiple sources. The platform understands natural language queries, recognizes context, and processes information much like a human researcher would—but at machine speed. Designed for professionals, researchers, students, and curious minds alike, QuestionAI serves as an intelligent assistant that not only answers questions but also helps users explore topics more deeply through related insights and explanations. Features Natural Language Processing: Ask questions in everyday language just as you would to a human expert, without needing to format queries in any special way. Contextual Understanding: The AI maintains conversation context, allowing for follow-up questions without repeating background information. Multi-Source Analysis: Draws information from diverse and verified sources to provide comprehensive answers that consider multiple perspectives. Citation Tracking: Clearly identifies the sources of information, allowing users to verify facts and explore topics more deeply. Customizable Knowledge Base: Ability to connect to specific document sets or databases for specialized questioning in professional environments. Visual Response Options: Receives responses not just as text but also as charts, graphs, and other visualizations when appropriate. Multilingual Support: Ask questions and receive answers in multiple languages, breaking down language barriers to information. Conversation History: Maintains a searchable log of previous questions and answers for easy reference and continued learning. Integration Capabilities: Connects with popular productivity tools, research platforms, and learning management systems. Privacy Controls: Robust security features ensure sensitive questions and information remain confidential. How It Works Question Input: Users enter their question in natural language through the clean, intuitive interface. AI Processing: The system analyzes the question to understand intent, context, and required information. Knowledge Base Search: QuestionAI scans its vast knowledge repositories, identifying relevant information from verified sources. Answer Synthesis: Rather than simply retrieving information, the AI synthesizes a coherent, comprehensive answer tailored to the specific question. Source Attribution: The system attributes information to its original sources, allowing users to verify claims and explore further. Refinement Loop: Users can ask follow-up questions or request clarification, with the system maintaining context from the previous exchanges. Continuous Learning: The platform improves over time, learning from interactions to provide increasingly relevant and accurate responses. Benefits Time Efficiency: Receive immediate answers to complex questions without sifting through multiple search results or documents. Information Accuracy: Benefit from answers drawn from verified sources with clear citations, reducing the risk of misinformation. Knowledge Depth: Explore topics more thoroughly with an AI that can handle increasingly specific and technical questions. Research Enhancement: Accelerate research processes by quickly establishing foundational knowledge before diving deeper. Learning Support: Supplement educational experiences with explanations that adapt to different knowledge levels. Decision Support: Make more informed decisions by accessing relevant information quickly and in context. Productivity Boost: Reduce time spent searching for information and more time applying insights to tasks and projects. Linguistic Accessibility: Access information regardless of language barriers through multilingual support. Reduced Cognitive Load: Offload the mental effort of searching and synthesizing information to an AI assistant. Continuous Knowledge Access: Stay informed with up-to-date information through a system that regularly updates its knowledge base. Pricing Free Tier: Limited daily questions with basic functionality, perfect for casual users exploring the platform. Personal Plan ($19/month): Unlimited questions, full feature access, and priority processing for individual users. Professional Plan ($49/month): Enhanced capabilities including document uploads, team sharing features, and advanced analytics. Enterprise Solution (Custom Pricing): Tailored implementation with private knowledge bases, enhanced security, dedicated support, and custom integrations. Educational Discount: Special pricing for students and educational institutions with additional learning-focused features. Annual Subscription: Save 20% when purchasing an annual subscription for any paid tier. Review QuestionAI delivers on its promise to revolutionize information retrieval through artificial intelligence. During our extensive testing, the platform consistently provided relevant, accurate answers to questions ranging from straightforward facts to complex conceptual inquiries. The natural language processing capabilities are particularly impressive, accurately interpreting questions even when phrased conversationally or with ambiguous terms. The system rarely misunderstands intent and, when it does, the clarification process is smooth and intuitive. Conclusion QuestionAI stands at the forefront of a new paradigm in information access, where artificial intelligence serves not just as a tool for finding information but as an active partner in knowledge exploration and synthesis. By combining advanced natural language processing, comprehensive knowledge repositories, and intuitive design, it delivers on the promise of AI as an extension of human cognitive capabilities. Visit Website The post QuestionAI appeared first on AI Parabellum • Your Go-To AI Tools Directory for Success.
-
Using On-Screen Keyboard in Raspberry Pi OS
by: Abhishek Prakash Wed, 05 Mar 2025 03:12:16 GMT From Kiosk projects to homelab dashboards, there are numerous usage of a touch screen display with Raspberry Pi. And it makes total sense to use the on-screen keyboard on the touch device rather than plugging in a keyboard and mouse. Thankfully, the latest versions of Raspberry Pi OS provide a simple way to install and use the on-screen keyboard. On-screen keyboard on Raspberry PiLet me show how you can install the on-screen keyboard support on Raspberry Pi OS. 📋I am using the DIY Touchscreen by SunFounder (partner link). It's an interesting display that is also compatible with other SBCs. I'll be doing its full review next week. The steps should also work on other touch screens, too.SunFounder Latest 10 Inch DIY Touch Screen All-In-One Solution for Raspberry Pi 5, IPS HD 1280x800 LCD, Built-In USB-C PD 5.1V/5A Output, HDMI, 10-point, No Driver, Speakers, for RPi 5/4/3/Zero 2WThis SunFounder Touch Screen is a 10-point IPS touch screen in a 10.1″ big size and with a high resolution of 1280x800, bringing you perfect visual experience. It works with various operating systems including Raspberry Pi OS, Ubuntu, Ubuntu Mate, Windows, Android, and Chrome OS.SunFounderSunFounderPartner Link Just check if you already have the on-screen keyboard supportRaspberry Pi OS Bookworm and later versions include the Squeekboard software for the on-screen keyboard feature. Now, this package may already be installed by default. If you open a terminal and touch the interface and it brings the keyboard, you have everything set already. It is also possible that it is installed but not enabled. Go to the menu, then Preferences and open Raspberry Pi config tool. In the display tab, see if you can change the settings for the on-screen keyboard. On-screen keyboard support already installed on Raspberry PiIf you tap the on-screen keyboard settings and it says, "A virtual keyboard is not installed", you will have to install the software first. The next section details the steps. Virtual Keyboard is not installedGetting on-screen keyboard in Raspberry Pi OS Bookworm🚧You'll need a physical keyboard and mouse for installing the required package If you cannot connect one, you could try to SSH into the Pi.Update the package cache of your Raspberry Pi first: sudo apt updateThe squeekboard package provides the virtual keyboard in Debian. Install it using the command below: sudo apt install squeekboardOnce installed, click on the menu and start Raspberry Pi Configuration from the Preferences. Access Raspberry Pi Configuration In the Raspberry Pi Configuration tool, go to the Display tab and touch it. You'll see three options: Enabled always: The on-screen keyboard will be always accessible through the top panel, whether you are using touchscreen or not.Enabled if touchscreen found: The on-screen keyboard is only accessible when it detects a touchscreen.Disabled: Virtual keyboard won't be accessible at all.Out of these three, you'll be tempted to go for the 'Enabled if touchscreen found'. However, it didn't work for me. I opted for Enabled always instead. But not all applications will automatically bring up the on-screen keyboard. In my case, Chromium didn't play well. Thankfully, the on-screen keyboard icon at top panel lets you access it at will. Virtual keyboard comes up for supported application but it is also accessible from top panelAnd this way, you can enjoy the keyboard on a touchscreen. ConclusionFor older versions of Raspberry Pi OS, you could also go with the matchbox-keyboard package. sudo apt install matchbox-keyboardSince Squeekboard is for Wayland, perhaps Matchbox will work on Xorg display server. The official documents of SunFounder's Touchscreen mentions that Squeekboard is installed by default in Raspberry Pi OS but that was not the case for me. Installing it was matter of one command and then the virtual keyboard was up and running. This is tested on Raspberry Pi OS but since Squeekboard is available for Wayland in general, it might work on other operating systems, too. 💬 Did it work for you? If yes, a simple 'thank you' will encourage me. If not, please provide the details and I'll try to help you.
-
MyReport by Alaba AI
by: aiparabellum.com Wed, 05 Mar 2025 02:53:02 +0000 In today’s data-driven business landscape, making sense of complex information quickly can be the difference between success and stagnation. Enter MyReport by Alaba AI, a cutting-edge tool designed to transform how professionals interact with and extract value from their data. This innovative platform leverages the power of artificial intelligence to streamline report creation, making business intelligence accessible to everyone, regardless of their technical expertise. Introduction MyReport stands at the intersection of artificial intelligence and business analytics, offering a seamless solution for professionals seeking to make data-driven decisions without the typical technical hurdles. The platform enables users to generate comprehensive, visually appealing reports from raw data in minutes rather than hours. By eliminating the tedious aspects of report creation, MyReport frees up valuable time for analysis and strategic planning, allowing teams to focus on what truly matters: extracting actionable insights from their data. Features of MyReport by Alaba AI Natural Language Processing: Simply tell the AI what kind of report you need in plain English, and watch as MyReport transforms your request into a structured document. Multi-Format Data Handling: Upload data in various formats including CSV, Excel, PDF, and more without worrying about compatibility issues. Automated Data Visualization: The platform intelligently selects the most appropriate charts, graphs, and visual representations for your data. Customizable Templates: Choose from professionally designed templates or create your own to maintain brand consistency across all reports. Collaborative Workspace: Multiple team members can work on reports simultaneously, leaving comments and suggestions in real-time. AI-Powered Insights: Beyond visualization, MyReport highlights key trends, anomalies, and potential opportunities hidden in your data. One-Click Sharing Options: Distribute finished reports across various channels with ease, including direct links, email, and integration with common workplace tools. Revision History: Track changes and revert to previous versions if needed, ensuring nothing gets lost in the iteration process. How It Works Data Upload: Begin by uploading your raw data files to MyReport through a simple drag-and-drop interface. AI Analysis: The system automatically analyzes your data, identifying relationships, patterns, and potential points of interest. Report Generation: Using natural language prompts, tell the AI what aspects of the data you want to highlight in your report. Customization: Fine-tune the generated report by adjusting visualizations, adding commentary, or rearranging sections to better tell your data story. Collaboration: Invite team members to review and contribute to the report before finalization. Export and Share: Download your completed report in multiple formats or share it directly with stakeholders through various channels. Benefits of MyReport by Alaba AI Time Efficiency: Reduce report creation time by up to 80% with MyReport, allowing your team to focus on analysis rather than formatting. Accessibility: Democratize data analysis by eliminating the need for specialized technical skills to create professional reports. Consistency: Ensure all company reports follow the same high-quality standards regardless of who creates them. Enhanced Decision Making: Surface insights that might be missed in manual analysis, leading to more informed business decisions. Cost Reduction: Lower the overhead costs associated with dedicated data analysis teams or specialized software training. Scalability: Whether you’re creating one report a month or dozens a day, MyReport scales to meet your needs without performance degradation. Error Reduction: Minimize human errors in data handling and calculation through automated processing. Professional Presentation: Impress clients and stakeholders with polished, visually appealing reports that effectively communicate complex information. Pricing Free Tier: Access basic MyReport features with limited monthly reports and standard templates. Perfect for individuals or small teams just getting started. Professional Plan ($29/month): Unlock advanced visualization options, custom branding, and increased report volume. Ideal for growing businesses with regular reporting needs. Business Plan ($79/month): Gain access to all premium features, priority processing, and team collaboration tools. Designed for established companies with multiple departments. Enterprise Solution (Custom Pricing): Tailored packages for large organizations with specific requirements, including dedicated support, custom integrations, and unlimited reporting capacity. Annual Discount: Save 20% on any paid plan when billed annually rather than monthly. Review After extensive testing, MyReport by Alaba AI proves itself to be a formidable ally in the quest for data-driven decision making. The platform’s intuitive interface belies its powerful capabilities, making it accessible to novices while still satisfying the demands of experienced data professionals. The natural language processing functionality stands out as particularly impressive, accurately interpreting even complex requests with minimal guidance. During our testing, we found that MyReport could handle industry-specific terminology with surprising fluency, suggesting a robust training model behind the scenes. Conclusion MyReport by Alaba AI emerges as a powerful solution in the evolving landscape of business intelligence tools. By combining sophisticated AI capabilities with user-friendly design, it effectively bridges the gap between raw data and actionable insights. While not without its learning curve, the platform’s ability to dramatically reduce report creation time while improving output quality makes it a compelling choice for organizations of all sizes. Visit Website The post MyReport by Alaba AI appeared first on AI Parabellum • Your Go-To AI Tools Directory for Success.
-
The Ultimate Kubectl Command Cheat Sheet
by: Sreenath V Tue, 04 Mar 2025 20:23:37 +0530 Kubernetes is a powerful platform designed to manage and automate the deployment, scaling, and operation of containerized applications. In simple terms, it helps you run and manage your software applications in an organized and efficient way. kubectl is the command-line tool that helps you manage your Kubernetes cluster. It allows you to deploy applications, manage resources, and get information about your applications. Simply put, kubectl is the main tool you use to communicate with Kubernetes and get things done. In this article, we will explore essential kubectl commands that will make managing your Kubernetes cluster easier and more efficient. Essential Kubernetes ConceptsBefore diving into the commands, let's quickly review some key Kubernetes concepts to ensure a solid understanding. Pod: The smallest deployable unit in Kubernetes, containing one or more containers that run together on the same node.Node: A physical or virtual machine in the Kubernetes cluster where Pods are deployed.Services: An abstraction that defines a set of Pods and provides a stable network endpoint to access them.Deployment: A controller that manages the desired state and lifecycle of Pods by creating, updating, and deleting them.Namespace: A logical partition in a Kubernetes cluster to isolate and organize resources for different users or teams.General Command Line OptionsThis section covers various optional flags and parameters that can be used with different kubectl commands. These options help customize the output format, specify namespaces, filter resources, and more, making it easier to manage and interact with your Kubernetes clusters. The get command in kubectl is used to retrieve information about Kubernetes resources. It can list various resources such as pods, services, nodes, and more. To retrieve a list of all the pods in your Kubernetes cluster in JSON format, kubectl get pods -o json List all the pods in the current namespace and output their details in YAML format. kubectl get pods -o yaml Output the details in plain-text format, including the node name for each pod, kubectl get pods -o wide List all the pods in a specific namespace using the -n option: kubectl get pods -n <namespace_name> To create a Kubernetes resource from a configuration file, us the command: kubectl create -f <filename> To filter logs by a specific label, you can use: kubectl logs -l <label_filter> For example, to get logs from all pods labeled app=myapp, you would use: kubectl logs -l app=myapp For quick command line help, always use the -h option. kubectl -h Create and Delete Kubernetes ResourcesIn Kubernetes, you can create resources using the kubectl create command, update or apply changes to existing resources with the kubectl apply command, and remove resources with the kubectl delete command. These commands allow you to manage the lifecycle of your Kubernetes resources effectively and efficiently. The apply and create are two different approaches to create resources in Kubernetes. While the apply follows a declarative approach, create follows an imperative approach. Learn about these different approaches in our dedicated article. kubectl apply vs create: What’s the Difference?Two different approaches for creating resources in Kubernetes cluster. What’s the difference?Linux HandbookRakesh JainTo apply a configuration file to a pod, use the command: kubectl apply -f <JSON/YAML configuration file> If you have multiple JSON/YAML configuration files, you can use glob pattern matching here: kubectl apply -f '*.json' To create a new Kubernetes resource using a configuration file, kubectl create -f <configuration file> The -f option can receive directory values or configuration file URL to create resource. kubectl create -f <directory> OR kubectl create -f <URL to files> The delete option is used to delete resources by file names, resources and names, or by resources and label selector. To delete resources using the type and name specified in the configuration file, kubectl delete -f <configuration file> Cluster Management and Context CommandsCluster management in Kubernetes refers to the process of querying and managing information about the Kubernetes cluster itself. According to the official documentation, it involves various commands to display endpoint information, view and manage cluster configurations, list API resources and versions, and manage contexts. The cluster-info command displays the endpoint information about the master and services in the cluster. kubectl cluster-info To print the client and server version information for the current context, use: kubectl version To display the merged kubeconfig settings, kubectl config view To extract and display the names of all users from the kubeconfig file, you can use a jsonpath expression. kubectl config view -o jsonpath='{.users[*].name}' Display the current context that kubectl is using, kubectl config current-context You can display a list of contexts with the get-context option. kubectl config get-contexts To set the default context, use: kubectl config use-context <context-name> Print the supported API resources on the server. kubectl api-resources It includes core resources like pods, services, and nodes, as well as custom resources defined by users or installed by operators. You can use the api-versions command to print the supported API versions on the server in the form of "group/version". This command helps you identify which API versions are available and supported by your Kubernetes cluster. kubectl api-versions The --all-namespaces option available with the get command can be used to list the requested object(s) across all namespaces. For example, to list all pods existing in all namespaces, kubectl get pods --all-namespaces DaemonsetsA DaemonSet in Kubernetes ensures that all (or some) Nodes run a copy of a specified Pod, providing essential node-local facilities like logging, monitoring, or networking services. As nodes are added or removed from the cluster, DaemonSets automatically add or remove Pods accordingly. They are particularly useful for running background tasks on every node and ensuring node-level functionality throughout the cluster. You can create a new DaemonSet with the command: kubectl create daemonset <daemonset_name> To list one or more DaemonSets, use the command: kubectl get daemonset The command, kubectl edit daemonset <daemonset_name> will open up the specified DaemonSet in the default editor so you can edit and update the definition. To delete a daemonset, kubectl delete daemonset <daemonset_name> You can check the rollout status of a daemonset with the kubectl rollout command: kubectl rollout status daemonset The command below provides detailed information about the specified DaemonSet in the given namespace: kubectl describe ds <daemonset_name> -n <namespace_name> DeploymentsKubernetes deployments are essential for managing and scaling applications. They ensure that the desired number of application instances are running at all times, making it easy to roll out updates, perform rollbacks, and maintain the overall health of your application by automatically replacing failed instances. In other words, Deployment allows you to manage updates for Pods and ReplicaSets in a declarative manner. By specifying the desired state in the Deployment configuration, the Deployment Controller adjusts the actual state to match at a controlled pace. You can use Deployments to create new ReplicaSets or replace existing ones while adopting their resources seamlessly. For more details, refer to StatefulSet vs. Deployment. To list one or more deployments: kubectl get deployment To display detailed information about the specified deployment, including its configuration, events, and status, kubectl describe deployment <deployment_name> The below command opens the specified deployment configuration in the default editor, allowing you to make changes to its configuration: kubectl edit deployment <deployment_name> To create a deployment using kubectl, specify the image to use for the deployment: kubectl create deployment <deployment_name> --image=<image_name> You can delete a specified deployment and all of its associated resources, such as Pods and ReplicaSets by using the command: kubectl delete deployment <deployment_name> To check the rollout status of the specified deployment and providing information about the progress of the deployment's update process, kubectl rollout status deployment <deployment_name> Perform a rolling update in Kubernetes by setting the container image to a new version for a specific deployment. kubectl set image deployment/<deployment name> <container name>=image:<new image version> To roll back the specified deployment to the previous revision (undo), kubectl rollout undo deployment/<deployment name> The command below will forcefully replace a resource from a configuration file: kubectl replace --force -f <configuration file> Retrieving and Filtering EventsIn Kubernetes, events are a crucial component for monitoring and diagnosing the state of your cluster. They provide real-time information about changes and actions happening within the system, such as pod creation, scaling operations, errors, and warnings. Use the command: kubectl get events To retrieve and list recent events for all resources in the system, providing valuable information about what has happened in your cluster. To filter and list only the events of type "Warning," thereby providing insights into any potential issues or warnings in your cluster, kubectl get events --field-selector type=Warning You can retrieve and list events sorted by their creation timestamp. This allows you to view events in chronological order. kubectl get events --sort-by=.metadata.creationTimestamp To lists events, excluding those related to Pod events, kubectl get events --field-selector involvedObject.kind!=Pod This helps you focus on events for other types of resources. To list events specifically for a node with the given name, kubectl get events --field-selector involvedObject.kind=Node, involvedObject.name=<node_name> You can filter events, excluding those that are of the "Normal" type, allowing you to focus on warning and error events that may require attention: kubectl get events --field-selector type!=Normal Managing LogsLogs are essential for understanding the real-time behavior and performance of your applications. They provide a record of activity and outputs generated by containers and pods, which can be invaluable for debugging and monitoring purposes. To print the logs for the specified pod: kubectl logs <pod_name> To print the logs for the specified pod since last hour: kubectl logs --since=1h <pod_name> You can read the most recent 50 lines of logs for the specified pod using the --tail option. kubectl logs --tail=50 <pod_name> The command below streams and continuously displays the logs of the specified pod, optionally filtered by the specified container: kubectl logs -f <pod_name> [-c <container_name>] For example, as per the official documentation, kubectl logs -f -c ruby web-1 Begin streaming the logs of the ruby container in pod web-1. To continuously display the logs of the specified pod in real-time, kubectl logs -f <pod_name> You can fetch the logs up to the current point in time for a specific container within the specified pod using the command: kubectl logs -c <container_name> <pod_name> To save the logs for the specified pod to a file, kubectl logs <pod_name> > pod.log To print the logs for the previous instance of the specified pod: kubectl logs --previous <pod_name> This is particularly useful for troubleshooting and analyzing logs from a previously failed pod. NamespacesIn Kubernetes, namespaces are used to divide and organize resources within a cluster, creating separate environments for different teams, projects, or applications. This helps in managing resources, access permissions, and ensuring that each group or application operates independently and securely. To create a new namespace with the specified name in your Kubernetes cluster: kubectl create namespace <namespace_name> To list all namespaces in your Kubernetes cluster, use the command: kubectl get namespaces You can get a detailed description of the specified namespace, including its status, resource quotas using the command: kubectl describe namespace <namespace_name> To delete the specified namespace along with all the resources contained within it: kubectl delete namespace <namespace_name> The command kubectl edit namespace <namespace_name> opens the default editor on your machine with the configuration of the specified namespace, allowing you to make changes directly. To display resource usage (CPU and memory) for all pods within a specific namespace, you can use the following command: kubectl top pods --namespace=<namespace_name> NodesIn Kubernetes, nodes are the fundamental building blocks of the cluster, serving as the physical or virtual machines that run your applications and services. To update the taints on one or more nodes, kubectl taint node <node_name> List all nodes in your Kubernetes cluster: kubectl get node Remove a specific node from your Kubernetes cluster, kubectl delete node <node_name> Display resource usage (CPU and memory) for all nodes in your Kubernetes cluster: kubectl top nodes List all pods running on a node with a specific name: kubectl get pods -o wide | grep <node_name> Add or update annotations on a specific node: kubectl annotate node <node_name> <key>=<value> 📋Annotations are key-value pairs that can be used to store arbitrary non-identifying metadata.Mark a node as unschedulable (no new pods will be scheduled on the specified node). kubectl cordon node <node_name> Mark a previously cordoned (unschedulable) node as schedulable again: kubectl uncordon node <node_name> Safely evict all pods from the specified node in preparation for maintenance or decommissioning: kubectl drain node <node_name> Add or update labels on a specific node in your Kubernetes cluster: kubectl label node <node_name> <key>=<value> PodsA pod is the smallest and simplest unit in the Kubernetes object model that you can create or deploy. A pod represents a single instance of a running process in your cluster and can contain one or more containers. These containers share the same network namespace, storage volumes, and lifecycle, allowing them to communicate with each other easily and share resources. Pods are designed to host tightly coupled application components and provide a higher level of abstraction for deploying, scaling, and managing applications in a Kubernetes environment. Each pod is scheduled on a node, where the containers within it are run and managed together as a single, cohesive unit. List all pods in your Kubernetes cluster: kubectl get pods List all pods in your Kubernetes cluster and sort them by the restart count of the first container in each pod: kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' List all pods in your Kubernetes cluster that are currently in the "Running" phase: kubectl get pods --field-selector=status.phase=Running Delete a specific pod from your Kubernetes cluster: kubectl delete pod <pod_name> Display detailed information about a specific pod in your Kubernetes cluster: kubectl describe pod <pod_name> Create a pod using the specifications provided in a YAML file: kubectl create -f pod.yaml OR kubectl apply -f pod.yaml To execute a command in a specific container within a pod in your Kubernetes cluster: kubectl exec <pod_name> -c <container_name> <command> Start an interactive shell session in a container within a specified pod: # For Single Container Pods kubectl exec -it <pod_name> -- /bin/sh # For Multi-container pods, kubectl exec -it <pod_name> -c <container_name> -- /bin/sh Display resource (CPU and memory) usage statistics for all pods in your Kubernetes cluster: kubectl top pods Add or update annotations on a specific pod: kubectl annotate pod <pod_name> <key>=<value> To add or update the label of a pod: kubectl label pod <pod_name> new-label=<label name> List all pods in your Kubernetes cluster and display their labels: kubectl get pods --show-labels Forward one or more local ports to a pod in your Kubernetes cluster, allowing you to access the pod's services from your local machine: kubectl port-forward <pod_name> <port_number_to_listen_on>:<port_number_to_forward_to> Replication ControllersReplication Controller (RC) ensures that a specified number of pod replicas are running at any given time. If any pod fails or is deleted, the Replication Controller automatically creates a replacement. This self-healing mechanism enables high availability and scalability of applications. To list all Replication Controllers in your Kubernetes cluster kubectl get rc List all Replication Controllers within a specific namespace: kubectl get rc --namespace=”<namespace_name>” ReplicaSetsReplicaSet is a higher-level concept that ensures a specified number of pod replicas are running at any given time. It functions similarly to a Replication Controller but offers more powerful and flexible capabilities. List all ReplicaSets in your Kubernetes cluster. kubectl get replicasets To display detailed information about a specific ReplicaSet: kubectl describe replicasets <replicaset_name> Scale the number of replicas for a specific resource, such as a Deployment, ReplicaSet, or ReplicationController, in your Kubernetes cluster. kubectl scale --replicas=<number_of_replicas> <resource_type>/<resource_name> SecretsSecrets are used to store and manage sensitive information such as passwords, tokens, and keys. Unlike regular configuration files, Secrets help ensure that confidential data is securely handled and kept separate from application code. Secrets can be created, managed, and accessed within the Kubernetes environment, providing a way to distribute and use sensitive data without exposing it in plain text. To create a Secret, kubectl create secret (docker-registry | generic | tls) List all Secrets in your Kubernetes cluster: kubectl get secrets Display detailed information about a specific Secret: kubectl describe secret <secret_name> Delete a specific Secret from your Kubernetes cluster: kubectl delete secret <secret_name> ServicesServices act as stable network endpoints for a group of pods, allowing seamless communication within the cluster. They provide a consistent way to access pods, even as they are dynamically created, deleted, or moved. By using a Service, you ensure that your applications can reliably find and interact with each other, regardless of the underlying pod changes. Services can also distribute traffic across multiple pods, providing load balancing and improving the resilience of your applications. To list all Services in your Kubernetes cluster: kubectl get services To display detailed information about a specific Service: kubectl describe service <service_name> Create a Service that exposes a deployment: kubectl expose deployment <deployment_name> --port=<port> --target-port=<target_port> --type=<type> Edit the configuration of a specific Service: kubectl edit service <service_name> Service AccountsService Accounts provide an identity for processes running within your cluster, enabling them to interact with the Kubernetes API and other resources. By assigning specific permissions and roles to Service Accounts, you can control access and limit the actions that pods and applications can perform, enhancing the security and management of your cluster. Service Accounts are essential for managing authentication and authorization, ensuring that each component operates with the appropriate level of access and adheres to the principle of least privilege. To list all Service Accounts in your Kubernetes cluster: kubectl get serviceaccounts Display detailed information about a specific Service Account: kubectl describe serviceaccount <serviceaccount_name> Next is replacing a service account. Before replacing, you need to export the existing Service Account definition to a YAML file. kubectl get serviceaccount <serviceaccount_name> -o yaml > serviceaccount.yaml Once you made changes to the YAML file, replace the existing Service Account with the modified one: kubectl replace -f serviceaccount.yaml Delete a specific Service Account from your Kubernetes cluster: kubectl delete serviceaccount <service_account_name> StatefulSetStatefulSet is a specialized workload controller designed for managing stateful applications. Unlike Deployments, which are suitable for stateless applications, StatefulSets provide guarantees about the ordering and uniqueness of pods. Each pod in a StatefulSet is assigned a unique, stable identity and is created in a specific order. This ensures consistency and reliability for applications that require persistent storage, such as databases or distributed systems. StatefulSets also facilitate the management of pod scaling, updates, and rollbacks while preserving the application's state and data. To list all StatefulSets in your Kubernetes cluster: kubectl get statefulsets To delete a specific StatefulSet from your Kubernetes cluster without deleting the associated pods: kubectl delete statefulset <stateful_set_name> --cascade=false 💬 Hope you like this quick overview of the kubectl commands. Please let me know if you have any questions or suggestions.
-
Top 7 Best Open Source Skype Alternatives In 2025
by: Sourav Rudra Tue, 04 Mar 2025 11:04:00 GMT May 5 2025, is the day Skype will cease to exist as Microsoft retires it, pushing people to switch to their Teams offering. The death of Skype was a slow one, but one that has been coming for quite some time now. While it may be appealing to switch to Teams, it is still Microsoft, the not-so-privacy friendly company☠️ So, why not give open source Skype alternatives a chance instead? You can stop sending your data to companies, and privately communicate with your friends and colleagues. Join me as I take you through some solid choices for secure and reliable video communication. 📋The list is in no particular order of ranking.1. JamiJami is a popular decentralised secure communication platform that offers messaging, voice calls, and video calls. Unlike Skype, Jami operates on a peer-to-peer architecture, which results in enhanced privacy and reliability for the people who use it. There are no restrictions on the number of messages, file size to upload, and calls. You can do it all, as long as you want, without sharing any personal information with the app. You can read up on our detailed coverage on Jami to learn more if you're intrigued by it. Key Highlights Supports group chatsEnd-to-end encryptionPeer-to-peer networkingSelf-hostableCan work as an SIP clientGet Jami You can get Jami for platforms like Linux, Android, Android TV, Windows, iOS, and macOS from the official website. JamiSuggested Read 📖 Jami: A Versatile Open-Source Distributed Communication AppInstalling and using Jami to give you a walkthrough of how it works, and what you can expect from it.It's FOSSAnkush Das2. LinphoneAs an open source VoIP (Voice over IP) application, Linphone enables high-quality audio and video calls using the SIP protocol. It is an ideal choice for both enterprises and organisations who prefer a secure, reliable way of communicating. You can choose between white label, open source, and proprietary license giving you flexibility on what you want. Key Highlights Supports VoIP callsMulti-platform supportLeverages SIP protocolWhite label, open source, and proprietary license optionsGet Linphone The official website hosts the packages for Linux, Android, Windows, iOS, and macOS. I had to sign up for a Linphone account to test things out, but there is also the option to connect to a third-party SIP account. Linphone3. Jitsi Meet OnlineIf you are someone who likes a communication solution that works in your web browser and mobile phones, then Jitsi Meet Online can be a good choice for you. It is a free, open source videoconferencing service from Jitsi that facilitates secure, encrypted meetings, with many useful features like chat, screen sharing, and recording. You can also choose to host your instance, and customize it to your heart's content. It has been one of the best open source video conferencing solutions out there. Key Highlights Unlimited participantsMinimal account setupSupports screen sharingSelf-hostableGet Jitsi Meet Online For communicating with others, you can either self-host Jitsi or directly start a meet on Jitsi Meet Online. Keep in mind that you have to create an account if you want a moderated video meet, and have the meeting URL booked in advance. Jitsi Meet Online4. MiroTalkSimilar tp Jitsi Meet, we have MiroTalk, a browser-based videoconferencing tool that uses WebRTC for real-time communication. Anyone who uses MiroTalk can expect to take advantage of an interactive whiteboard, seamless file sharing, and low-latency audio/video calls. Key Highlights Can be self-hostedNo installation requiredLow-latency connectionsGet MiroTalk Being a no-nonsense service, using MiroTalk is as simple as visiting the official website and joining a room. You just have to enter a display name and click on "Join meeting". There's ChatGPT integration as well, though I would want to stay away from that. MiroTalk5. ElementElement web in action.Element is one of the best Matrix clients, enabling decentralized and secure communication over text, voice, and video. It can be a great Skype alternative if you find the other options on this list to be too complicated. Users can either self-host or sign up with Element’s free hosted service for their account. These approaches ensure flexibility and control over one's data. Element offers end-to-end encryption, allowing users to have private conversations without a third party snooping in. It also supports file sharing, group chats, and integration with other services. Key Highlights Easy file transfersSelf-hostablePowered by Matrix protocolSupports voice and video callsGet Element You can get Element for both desktop and mobile, with apps being made available for Linux, Android, Windows, iOS, and macOS. There is also Element web if you don't prefer installing apps. Element9 Best Matrix Clients for Decentralized MessagingMatrix clients help you experience secure, and decentralized messaging. Here are the best options if you want to use it.It's FOSSAnkush Das6. WireWhile Wire has a strong focus on team communication, it can still be used for personal use to connect with other people over text, voice, or video. The platform provides end-to-end encryption by default, while offering a user-friendly experience for everyone who tries it. If you are an organisation looking for a secure alternative to Skype, this can be a great option to explore. Key Highlights End-to-end encryptionSupports multi-device syncReal-time team collaborationGet Wire Before you proceed, please ensure that you have a Personal account configured if you are an individual user. I say that because, during my testing, I mistakenly went for a team account during the onboarding. Applications can be downloaded for Linux, Android, Windows, iOS, and macOS from the official website. There is also a web version for those who prefer webapps. Wire7. Nextcloud TalkNextcloud is a versatile open-source remote working tool, and Nextcloud Talk provides excellent video conferencing and communication capabilities. If you have a Nextcloud server, the Talk portal offers features like screen sharing and messaging, fulfilling your video conferencing needs. However, the only catch here is, setting up a Nextcloud instance requires some technical expertise. Key Highlights Screen sharingMessagingIntegrated into the Nextcloud ecosystemSelf-hostableGet Nextcloud Talk To utilize Nextcloud Talk, you need a Nextcloud server. Once your server is live, Nextcloud Talk can be used for video conferencing and communication. Nextcloud TalkWrapping UpIt is easy to replace Microsoft's Skype in 2025, with all the open source solutions out there. Furthermore, the open source options offer way better control, customizations, and privacy-friendly features to give you a better user experience 💬 If you feel that I missed any good alternatives, please let me know in the comments. What will you be choosing to replace Microsoft's Skype? Let me know!
-
Chris’ Corner: Color Accessibility
by: Chris Coyier Mon, 03 Mar 2025 16:30:37 +0000 I’ve been a bit sucked into the game Balatro lately. Seriously. Tell me your strategies. I enjoy playing it equally as much lately as unwinding watching streamers play it on YouTube. Balatro has a handful of accessibility features. Stuff like slowing down or turning off animations and the like. I’m particularly interested one of the checkboxes below though: “High Contrast Cards” is one of the options. It’s a nice option to have, but I find it particularly notable because of it’s popularity. You know those streamers I mentioned? The all seem to have this option turned on. Interesting how an “accessibility feature” actually seems to make the game better for everybody. As in, maybe the default should be reversed or just not there at all, with the high contrast version being just how it is. It reminds me about how half of Americans, particularly the younger generation, prefer having closed captioning on TV some or all of the time. An accessibility feature that they just prefer. Interestingly, the high contrast mode in Balatro mostly focuses on changing colors. If you don’t suffer from any sort of colorblindness (like me? I think?) you’ll notice the clubs above are blue, which differentiates them from the spades which remain black. The hearts and clubs are slightly differentiated with the diamonds being a bit more orange than red. Is that enough? It’s enough for many players preferring it, likely preventing accidentally playing a flush hand with the wrong suits, for example. But I can’t vouch for if it works for people with actual low vision or a type of color blindness, which is what I’d assume would be the main point of the feature. Andy Baio wrote a memorable post about colorblindness a few years ago called Chasing rainbows. There are some great examples in that post that highlight the particular type of colorblindness Andy has. Sometimes super different colors look a lot closer together than you’d expect, but still fairly distinct. Where sometimes two colors that are a bit different actually appear identical to Andy. So maybe the Balatro colors are enough (lemme know!) or maybe they are not. I assume that’s why a lot of “high contrast” variations do more than color, they incorporate different patterns and whatnot. Which, fair enough, the playing cards of Balatro already do. Let’s do a few more fun CSS and color related links to round out the week: Adam Argyle: A conic gradient diamond and okLCH — I’m always a little surprised at the trickery that conic gradients unlock. Whenever I think of them I’m like uhmmmmm color pickers and spinners I guess? Michelle Barker: Messing About with CSS Gradients — Layered gradients unlocking some interested effects and yet more trickery. Michelle Barker: Creating color palettes with the CSS color-mix() function — Sure, color-mix() is nice for a one-off where you’re trying to ensure contrast or build the perfect combo from an unknown other color, but it can also be the foundational tool for a system of colors. Keith Grant: Theme Machine — A nice take on going from choosing nice individual colors to crafting palettes, seeing them in action, and getting custom property output for CSS.
-
Role model blog: Krittika Varmann, F-Secure
by: Tatiana P Mon, 03 Mar 2025 15:22:06 +0000 We can no longer say that the jobs will stay the same 10 years from now, so we need to constantly re-evaluate our options based on reality and what is available out there. About meI am Krittika Varmann. I am a Senior Cloud and AI Developer for F-Secure. I am an engineer at heart, drawn to solving problems simply for the joy of the process -sometimes, the journey matters more to me than the destination. I have always been eager to see my work have a real-world impact, and I strongly believe in maintaining a balance between work, health, hobbies, and relationships. These values have significantly shaped my career path and life choices. Instead of pursuing theoretical research or academia, I gravitated toward industrial innovations, applying AI to solve real-life challenges. Beyond engineering and AI, I am endlessly fascinated by human behaviour and technology. Whether it is cognitive biases, effective communications, or the art of persuasion, I love exploring how psychology intersects everyday life and business. You will often find me immersed in books on these topics. In my free time, I enjoy playing board games with friends, going to the sauna, winter swimming, and baking. On my path to F-SecureI have seven years of experience in data, cloud & AI, with a career shaped by curiosity, adaptability, and a motivation to stay ahead of industry trends. My journey began as a researcher and project coordinator at the University of Eastern Finland in Joensuu. From there, I transitioned to Kone, where I worked as a data scientist before shifting into data engineering. I made this transition for two key reasons. First, I wanted to develop hands-on skills by working across the entire data pipeline -from start to finish- so I could build and manage solutions independently. Second, I saw data engineering to future-proof my career, keeping myself highly employable and aligned with in-demand roles. After four years at Kone, I moved to Sanoma, where I worked as a cloud engineer for about a year and a half. Then, four months ago, I transitioned to F-Secure, a move driven by careful deduction, prioritization, and a clear vision of what I want from my career and life. The main reason for me joining F-Secure was the cybersecurity domain of the company. As technology evolves and data becomes even more valuable, security threats are increasing. Cybersecurity, in my opinion, will only grow in importance in the coming years. F-Secure is an incredible place to work, and what I appreciate most is that the product itself is software. The company’s core focus is on building high-quality, industry-standard code, which aligns perfectly with my values as an engineer. The role itself also allows me to bring together all the skills I have acquired through the shifts in my career: API development, cloud infrastructure, ML modelling, MLOps, testing & writing production-grade code. The people I work with have fantastic work ethics, so I have much to feel inspired by my colleagues. And as I said, cybersecurity is such a critical domain in this world right now. I see this as an opportunity to make a real-world impact and contribute to a vital field in protecting information. Krittika Varmann, Senior Cloud and AI Developer, F-Secure The beginning of my studiesI have a bachelor’s in printing engineering, where I explored media, ink, paper, and printing technologies. During my studies, I completed two internships -one at a packaging company in China and another at a German startup researching electronic ink through the DAAD scholarship. Later, I received an Erasmus Mundus scholarship for my master’s in colour science: a dual degree in optics and computer science across France, Spain, and Finland. My thesis focused on applying AI to smart lighting solutions. Upon arriving in Finland, I immediately felt at home -the direct culture and strong work-life balance resonated with me, leading me to stay. Strategic Approach to Learning Strategic decisions have shaped my academic and career choices. Coming from a highly competitive environment in India, I sought alternative fields where I could stand out. Instead of pursuing computer science or electronics engineering, I chose printing engineering, where competition was lower, allowing me to excel in this field and still have time to acquire other skills like studying German and Mandarin. I proactively reached out to professors worldwide, securing unique job opportunities. These experiences had a snowball effect -my internship in China and my German language strengthened my application for the DAAD scholarship which in turn positively affected my application for the Erasmus Mundus scholarship to do my master’s degree. Maximizing Future OptionsMy advice for those starting is to maintain a curious mindset and keep pushing to create and expand future opportunities at every step. When you begin, you have fewer options, but you can expand opportunities for the future so that you have options to choose from. Sometimes, I’ve seen people start with something, get stuck with it, and spend many years doing it. I’ve seen people staying in the same work for 20 years, and that’s not necessarily bad for somebody who wants that. But for me, that narrows down my options. I believe in maximizing future opportunities rather than getting confined to a single domain. This philosophy aligns with Morgan Housel’s powerful definition of wealth from ‘The Psychology of Money’: ‘Wealth is having the freedom to do what you want, when you want, with whom you want, for as long as you want.’ I strive to maximize this kind of freedom in my career. Many people stay in one job for decades, which works for some, but I prefer versatility. If I ever wake up feeling unfulfilled, I want the flexibility to switch paths. Without the foundational work I put in early on, making transitions would have felt overwhelming. However, transitions have become much smoother and more natural for me because I developed the habit of adapting and exploring different domains from the start. We can no longer say that the jobs will stay the same 10 years from now, so we need to constantly re-evaluate our options based on reality and what is actually available out there. We must be ready to jump to things and do things that don’t make us feel comfortable. If we want to thrive in this fast-changing environment, we must keep adapting and pushing ourselves to take on new challenges. In a world where technology evolves rapidly and jobs become obsolete, adaptability is crucial. You can either stay in your comfort zone and risk stagnation or embrace change and continuously challenge yourself. Both come with struggles, and choosing the struggle that aligns with your long-term goals is key. Networking tips from Krittika Value Networking in Tech BringsThe tech industry is quite tightly knit, especially in Finland, where the community is small. After a while, you’ll find everybody knows everybody. It’s not uncommon to hear a Finn say, “Oh, I know him from back in the Nokia days!” This, along with the concept of Nordic Trust, meaning there is a great deal of trust in recommendations, business operations, and general dealings in Nordic communities, can significantly influence your career prospects. As a personal example, after finishing my third semester studying in Finland, I had the opportunity to pursue my master’s thesis anywhere in the world, but by then, I had already decided to stay in Finland and opted for an industrial Master Thesis rather than an academic one. I did it with a Finnish innovation company, and later, when I applied for a position at Kone, my former manager saw my supervisor’s name and said, “Oh, I know him from Nokia times. Mind if I give him a call?” My supervisor gave me a stellar recommendation, and I was hired. Preparing for NetworkingI usually research the person and find something in their bio/LinkedIn/resume/publications/websites that could serve as good common ground. I use that to start a conversation, e.g., “Oh, I noticed you worked on satellites at XYZ company. That seemed interesting to me. I also worked on satellites during my astronomy lessons. I was wondering how you solved ABC using XYZ technology?” Then I find a way to segue into something else. Finding Offline Networking OpportunitiesFor tech-related networking, I usually attend AWS Meetup groups and other similar events like Confluence-led meetups or Terraform meetups. I’ve also gained many networking benefits by attending the AWS Stockholm Summit, where I met AWS experts in the Nordics while improving my knowledge base on cloud technologies. There are also opportunities to participate in hackathons like Junction, hosted by Aalto University along with other companies. It’s a great way to get noticed by companies. A huge source of networking for me has been being part of the Finland Young Professional group. Unfortunately, the only way to join is by working for a company that is part of the network, but the good news is that many tech companies in Finland are already members. FYP frequently hosts events like the Hiimos ski break and the Tallinn trip, where group activities turn professional contacts into close friends. I would suggest finding events where you can showcase your projects and talk about what you have learned and how they can benefit real-life problem-solving. Podcasts, blogs, and online content shared on social media are also great directions. Maintaining & Nurturing Professional NetworksThe most important thing when you meet someone is to add them on LinkedIn. This opens many channels as your network grows, and someone who knows someone can often help you out when in need. I’m active in the LinkedIn community, and when a contact posts updates, I often react and comment with encouraging words. This helps keep the connection fresh and reinforces the acquaintance. I’ve changed companies a couple of times but made sure to keep in touch with former colleagues. Every few months, I suggest going out for dinner, which has kept those bonds alive. Being genuinely curious about people, adding them on LinkedIn, following up after networking events, and being proactive in organizing or attending tech events, even if you don’t know anyone there, is a great way to get out of your comfort zone. Networking MistakesA few mistakes one could make in networking include: being overly self-promotional, being too aggressive (pushing for referrals or jobs), not expanding beyond your comfort zones, and the biggest one: not preparing for networking events. Showing up without knowing who will be there and having some conversation starters ready can lead to missed opportunities. Best Advice That Helped Advance My CareerThe best advice would be: In life, you get exactly what you ask for. If you don’t know what you want, how to formulate it, or how to ask for it, it’s highly unlikely you’ll ever get it. I’ve never shied away from asking for more, and even one proactive action can lead to ripple effects for the future. For example, I was a highly inexperienced bachelor’s student in my home country and somehow managed to get into a printing press as a summer intern. There was a visiting technician from the UK who was fixing a packaging machine, and I stood next to him every day, observing and taking notes on what he did. He noticed my curiosity, and when I asked him if he knew of any internship opportunities abroad, he immediately gave me a contact in China. At just 20 years old, I got to do an internship abroad in a production facility, which helped my Master’s applications in Europe. I often think back to that day fondly. If I had never asked for that opportunity, I might not have ended up in Finland. Gaining More ConfidenceI recommend reading How to Win Friends and Influence People by Dale Carnegie. The book talks about several tips for improving communication, such as showing curiosity about other people’s lives, remembering people’s names, and listening actively. Another book worth reading, especially for introverts, is The Subtle Art of Not Giving a Fck* by Mark Manson. It talks about many mechanisms for navigating life better. A relevant tip is The Spotlight Effect, which, from psychology, means that when we are in public, we tend to think everyone is looking at us. The paradox is that, since everybody thinks this way, they are more aware of themselves than of you. It’s more likely you remember making a fool of yourself than they do. You can use this information to your advantage because it frees you from the fear of making mistakes and helps you stop taking yourself so seriously. Finally, the last thing I want to say is that, as a proponent of gender-balanced opportunities, research shows that women have been raised not to fail, whereas men have been raised with more freedom to make mistakes. I use this information to inspire myself because a man wouldn’t hesitate to approach a stranger and start a conversation, possibly making mistakes in his career. But women tend to overthink and underdo, which prevents them from even getting those opportunities in the first place. In my opinion, it’s far better to get an opportunity and make a mistake than to try to be perfect and never take any chances at all. Amplifying Your Voice as a Woman in TechTwo pieces of advice that stuck with me from Pia Nilsson, Director of Engineering at Spotify, during the Stockholm Summit: 1. If you, as a woman, are doing a lot of glue jobs like organizing social events that contribute positively to the workplace atmosphere, make sure your upper management is aware of that and your role in it. Also, try to set up a rotation cycle so you’re not stuck doing it all by yourself. 2. If, after 4 years of being an engineer, you’re asked to become lead, imagine a few years down the line when you try to lead a team of engineers with 10-14 years of experience. You’ll have no clout to lead them, and you’ll become a default “people leader.” Also, I believe in the mantra Let action speak louder than words. Go get that certification, go make mistakes, go learn from them, and use facts and reason when discussing problems with colleagues. When you make good points, it’s hard to negate them. The Constantly Evolving Tech IndustryThe best thing (and sometimes the worst) about the tech industry is that it’s constantly evolving. This means a person can have 10 years’ experience coding in Java and still not get a job in software engineering because they don’t know Python or have no experience with other coding languages. Most tech people are self-taught, and being in tech is largely about being willing to fail, pick yourself up, and start again the next day. Not to undermine seniority, but if there’s any industry where fast learning skills often overtake experience, it’s tech. There are many stories of young tech startup founders becoming big shots overnight because they dared to dream and take actions, even without experience. Everybody starts somewhere, and it’s never too late to start. In general, my motto in life is not to compare myself to others but to simply remember we are all on our own journeys and paths. It’s also about an abundance mindset: There are enough resources and opportunities out there for each of us. There’s no need to compete. All you need is one spot, one opportunity, one person to believe in you. If someone has more experience, it means they’ve put in their time and effort to get there, and if you want to be like them, you must be willing to put in the work and fail just as they have. Let that inspire you rather than demotivate you. Also, remember you bring unique skills and talents to the table, so there’s no need to be anyone else. Make it your own. The post Role model blog: Krittika Varmann, F-Secure first appeared on Women in Tech Finland.
-
Functions in CSS?!
by: Juan Diego Rodríguez Mon, 03 Mar 2025 13:34:22 +0000 A much-needed disclaimer: You (kinda) can use functions now! I know, it isn’t the most pleasant feeling to finish reading about a new feature just for the author to say “And we’ll hopefully see it in a couple of years”. Luckily, right now you can use an (incomplete) version of CSS functions in Chrome Canary behind an experimental flag, although who knows when we’ll get to use them in a production environment. Arguments, defaults, and returns! I was drinking coffee when I read the news on Chrome prototyping functions in CSS and… I didn’t spit it or anything. I was excited, but thought “functions” in CSS would be just like mixins in Sass — you know, patterns for establishing reusable patterns. That’s cool but is really more or less syntactic sugar for writing less CSS. But I looked at the example snippet a little more closely and that’s when the coffee nearly came shooting out my mouth. From Bramus in Bluesky Arguments?! Return values?! That’s worth spitting my coffee out for! I had to learn more about them, and luckily, the spec is clearly written, which you can find right here. What’s crazier, you can use functions right now in Chrome Canary! So, after reading and playing around, here are my key insights on what you need to know about CSS Functions. What exactly is a function in CSS? I like this definition from the spec: They are used in the same places you would use a custom property, but functions return different things depending on the argument we pass. The syntax for the most basic function is the @function at-rule, followed by the name of the function as a <dashed-ident> + () @function --dashed-border() { /* ... */ } A function without arguments is like a custom property, so meh… To make them functional we can pass arguments inside the parenthesis, also as <dashed-ident>s @function --dashed-border(--color) { /* ... */ } We can use the result descriptor to return something based on our argument: @function --dashed-border(--color) { result: 2px dashed var(--color); } div { border: --dashed-border(blue); /* 2px dashed blue */ } Functions can have type-checking Functions can have type-checking for arguments and return values, which will be useful whenever we want to interpolate a value just like we do with variables created with @property, and once we have inline conditionals, to make different calculations depending on the argument type. To add argument types, we pass a syntax component. That is the type enclosed in angle brackets, where color is <color> and length is <length>, just to name a couple. There are also syntax multipliers like plus (+) to accept a space-separated list of that type. @function --custom-spacing(--a <length>) { /* ... */ } /* e.g. 10px */ @function --custom-background(--b <color>) { /* ... */ } /* e.g. hsl(50%, 30% 50%) */ @function --custom-margin(--c <length>+) { /* ... */ } /* e.g. 10px 2rem 20px */ If instead, we want to define the type of the return value, we can write the returns keyword followed by the syntax component: @function --progression(--current, --total) returns <percentage> { result: calc(var(--current) / var(--total) * 100%); } Just a little exception for types: if we want to accept more than one type using the syntax combinator (|), we’ll have to enclose the types in a type() wrapper function: @function --wideness(--d type(<number> | <percentage>)) { /* ... */ } Functions can have list arguments While it doesn’t currently seem to work in Canary, we’ll be able in the future to take lists as arguments by enclosing them inside curly braces. So, this example from the spec passes a list of values like {1px, 7px, 2px} and gets its maximum to perform a sum. @function --max-plus-x(--list, --x) { result: calc(max(var(--list)) + var(--x)); } div { width: --max-plus-x({ 1px, 7px, 2px }, 3px); /* 10px */ } I wonder then, will it be possible to select a specific element from a list? And also define how long should the list should be? Say we want to only accept lists that contain four elements, then select each individually to perform some calculation and return it. Many questions here! Early returns aren’t possible That’s correct, early returns aren’t possible. This isn’t something defined in the spec that hasn’t been prototyped, but something that simply won’t be allowed. So, if we have two returns, one enclosed early behind a @media or @supports at-rule and one outside at the end, the last result will always be returned: @function --suitable-font-size() { @media (width > 1000px) { result: 20px; } result: 16px; /* This always returns 16px */ } We have to change the order of the returns, leaving the conditional result for last. This doesn’t make a lot of sense in other programming languages, where the function ends after returning something, but there is a reason the C in CSS stands for Cascade: this order allows the conditional result to override the last result which is very CSS-y is nature: @function --suitable-font-size() { result: 16px; @media (width > 1000px) { result: 20px; } } Imagining the possibilities Here I wanted everyone to chip in and write about the new things we could make using functions. So the team here at CSS-Tricks put our heads together and thought about some use cases for functions. Some are little helper functions we’ll sprinkle a lot throughout our CSS, while others open new possibilities. Remember, all of these examples should be viewed in Chrome Canary until support expands to other browsers. Here’s a basic helper function from Geoff that sets fluid type: @function --fluid-type(--font-min, --font-max) { result: clamp(var(--font-min), 4vw + 1rem, var(--font-max)); } h2 { font-size: --fluid-type(24px, 36px); } CodePen Embed Fallback This one is from Ryan, who is setting the width with an intrinsic container function — notice the default arguments. @function --intrinsic-container(--inline-margin: 1rem, --max-width: 60ch) { result: min(100% - var(--inline-margin), var(--max-width)); } CodePen Embed Fallback This one is from moi. When I made that demo using tan(atan2()) to create viewport transitions, I used a helper property called --wideness to get the screen width as a decimal between 0 to 1. At that moment, I wished for a function form of --wideness. As I described it back then: I thought I would never see it, but now I can make it myself! Using that wideness function, I can move an element through its offset-path as the screen goes from 400px to 800px: .marker { offset-path: path("M 5 5 m -4, 0 a 4,4 0 1,0 8,0 a 4,4 0 1,0 -8,0"); /* Circular Orbit */ offset-distance: calc(--wideness(400, 800) * 100%); /* moves the element when the screen goes from 400px to 800px */ } CodePen Embed Fallback What’s missing? According to Chrome’s issue on CSS Functions, we are in a super early stage since we cannot: …use local variables. Although I tried them and they seem to work. …use recursive functions (they crash!), …list arguments, …update a function and let the appropriate styles change, …use @function in cascade layers, or in the CSS Object Model (CSSOM), …use “the Iverson bracket functions … so any @media queries or similar will need to be made using helper custom properties (on :root or similar).” After reading what on earth an Iverson bracket is, I understood that we currently can’t have a return value behind a @media or @support rule. For example, this snippet from the spec shouldn’t work: @function --suitable-font-size() { result: 16px; @media (width > 1000px) { result: 20px; } } Although, upon testing, it seems like it’s supported now. Still, we can use a provisional custom property and return it at the end if it isn’t working for you: @function --suitable-font-size() { --size: 16px; @media (width > 600px) { --size: 20px; } result: var(--size); } CodePen Embed Fallback What about mixins? Soon, they’ll be here. According to the spec: In conclusion… I say it with confidence: functions will bring an enormous change to CSS, not in the sense that we’ll write it any differently — we won’t use functions to center a <div>, but they will simplify hack-ish CSS and open a lot of new possibilities. There’ll be a time when our cyborg children ask us from their education pods, “Is it true you guys didn’t have functions in CSS?” And we’ll answer “No, Zeta-5 ∀umina™, we didn’t” while shedding a tear. And that will blow their ZetaPentium© Gen 31 Brain chips. That is if CSS lasts long enough, but in the meantime, I am happy to change my site’s font with a function. Functions in CSS?! originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
7 Best Github Alternatives in 2025
by: Neeraj Mishra Sun, 02 Mar 2025 10:41:00 +0000 Here you will get list of some best github alternatives that provide private and public repository. Being into software development we very often find ourselves in the need to host our code to any website. For the purpose, masses are blindly following one single medium for this, Github. It can not be denied that Github users have their choice to use either Git or Subversion for version control. Also there is a facility of unlimited public code repository for all users of Github. One more fascinating feature of Github is that allows to create ‘organizations’, which at its own is a normal account but at least one user account is required to be listed as the owner of the organization. Apart from providing desktop apps for Windows and OSX, Github also provides the facility to its users and organizations to host one website and unlimited project pages for free on the Github’s website. The typical domain for the hosted websites look something like username.github.io and address of the project pages may look like username.github.io/project-page. Moving ahead, we have compiled a list of few other mediums that can also be used in place Github without any harm. So come let’s have a look on the list. 7 Best Github Alternatives 1. Bitbucket On contrary to the Github, the Bitbucket comes just next to it in terms of usage and global popularity. Bitbucket also provides a free account for the users and organizations as well with limit for five users. Also, it provides access to unlimited private and public repos. One of the features which is note worthy is its allowance for the users to puch their files using any of the Git client/Git command line. Atlassian is the developer of Bitbucket providing access to the version capability to the users using their web interface. A free Mac and Windows interface is also available for using Gitbucket’s own Git and Mercurial client Source Tree. The domain for your hosted website on Bitbucket will look something like: accountname.bitbucket.org and domain for that of project pages will be like: accountname.bitbucket.org/project. On the other hand Bitbucket also allows its users to use their own domain name for their website. 2. Beanstalk Beanstalk as another good Github alternative but it is not free. You can get a trial of the resource for two weeks after which if you wish to continue you will have a pay an amount of minimum $15 for its cheapest Bronze package. Bronze package lets you have maximum of 10 repositories with 3 Gigabytes of storage capacity and maximum upto 5 users. Beanstalk supports the most demanded Git and Subversion control systems for version control. It is developed by Wildbit and also allows for code editing in the browser itself so that user need not to switch to command line every now and then. 3. GitLab GitLab is popular among the users due to its features like dedicated project website and an integrated project wiki. Also GitLab facilitates its users by providing automated testing and code delivery so that a user can do more work in lesser time without waiting for the tests to pass manually. Some of the else features to be noted are pull requests, code viewer and merge conflict resolution. 4. Kiln Developed by Fog Creek, unlike Github Kiln is not a free source to host your software or website. You can have an overview or experience of their version control and code hosting for Git and Mercurial for 30 days trial period, after that users need to upgrade to the premium version (minimum $18 a month) inorder to continue working with Kiln. Kiln also charges its users for the code review module separately. If you host your website with Kiln, your domain will look something like this: companyname.kilnhg.com 5. SourceForge It is believed by observing abundance of projects being hosted on the SourceForge that it has existed for a longer time. When compared to the Github, SourceForge (developed by Slashdot Media) has an entirely different structure of the project. Unlike other websites for version control, SourceForge allows you to host both static and dynamic pages as well. One of the vulnerability of this medium for version control is that a user is allowed to create projects and get it hosted on the site with unique names only. Typical domain for your hosted project will look like proj.sourceforge.net Scripting languages like Python, Perl, PHP, Tcl, Ruby and Shell are being supported by the SourceForge servers. Users are free to choosing either Git, Subversion or Mercurial for the version control system. 6. Cloud Source by Google This Google’s Git version control came into existence and moved to the Google Cloud platform when Google code was put out of the market by google itself. Although google provides its own repositories to work upon, but you can even connect the Cloud Source to other version control mediums like Github, Bitbucket, etc. Cloud Source offers storage for its users codes and apps across the google infrastructure itself which makes it even more reliable. Users have the freeship to search their code in the browser itself and also gets feature of cloud diagnostics to track the problems while code keeps running in the background. Cloud Source offers Stackdriver Debugger that helps use the debugger in parallel with the other applications running. 7. GitKraken GitKraken became popular among the developers day by day due to the exclusive features it provides to it users are just adorable. The primary point of attraction towards Gitkraken is its beautiful interface and also it focus on speed and ease of use for Git. GitKraken comes with an incredibly handy ‘undo’ button which helps its users to quickly omit the redundancies occurred by mistake. GitKraken provides a free version which can have upto 20 users and a premium version as well with several other good features. We hope you guys enjoyed learning with us. If any doubts, queries or suggestions please lets us know in the comment section below. Do share in comments if you know any other good github alternatives. The post 7 Best Github Alternatives in 2025 appeared first on The Crazy Programmer.
-
8 Best Keyboards for Programming in India 2025
by: Chirag Manghnani Sat, 01 Mar 2025 18:16:00 +0000 For a lot of programmers, finding a decent keyboard will significantly boost their workflow environment. Here, in this article, you’ll find a list of best keyboards for programming and a strait-laced comparison between them. The programmers typically spend their days’ planning, writing, and checking code in their machine. The keyboard is, therefore, one of the most critical instruments in their arsenal. The right keyboard for your necessity is not an easy task to find. This is why we are collecting the list of best programming keyboards. It’s not just ambient RGB lighting or a cool minimum aesthetic you get by choosing an excellent keyboard for your typeface. Gamers who play the best computer games or content developers and professional programmers, all that matters for them are pace, reactivity, precision, and comfort. What is that you need? It would be best if you had a keyboard to ease your work. A keyboard that you can type without pressure during the day and program it quickly on your computer to reach the most frequent applications. A large keyboard can reduce the amount and usability of your cursor. Also, a keyboard that has a comfortable plushy wrist brace, magnetically connected when you are working long hours, and having extra support for your hand. The keyboard that also has media functions for changing speed, listening, pause, or skipping songs. Also Read: How to Choose Best Laptop for Programming? Ultimately, a keyboard that helps you swift in your daily work! Here are the best claviers, from the best game keyboards to the perfect ones for productivity and creation. And we have included a comparison table to make sure you get the best price available as well. List of Best Keyboards for Programming Redgear Blaze Semi-Mechanical Wired Gaming Keyboard The Redgear Blaze Semi-Mechanical wired Gaming keyboard comes with three colors backlit light, full aluminum body & Windows key lock for PC. The Blaze is designed especially for pro-gaming and programming. It was intended for both programmers and low or high DPI players, so the interface allows ample room to spread the mouse around. In addition, for each strain, the Ergonomic float caps give you the best space. The Blaze has perfectly positioned keycaps that provide precise results whenever you click. Features: 100M long-lasting switches for crisp response. 3 Color mode for different gaming setup needs. Windows key lock option to block pop-up in the game. 19 keys anti-ghost for gamers and programmers Floating keycaps with greater durability and high responsiveness Cosmic Byte CB-GK-10 Corona Wired Gaming Keyboard This keyboard comes with the wired USB interface, especially for programmers and players with 19 Anti-ghosting keys. The four levels of brightness adjustment make it convenient for users to work with peace of mind. The keyboard features different internet hotkeys and media hotkeys for easy access. Features: Wired USB keyboard interface with Red Backlit and four levels of brightness adjustment. 19 Anti-ghosting and scratch-resistant keys. Key life with more than 10 million keystrokes. Zebronics Mechanical USB Wired Keyboard Max Plus Max Plus is a robust 104-key USB mechanical keyboard with 12 additional multimedia keys. It has 7 LED modes and five LED levels of luminosity in multicolor LEDs. For all this gaming action, it is a heavy-duty keyboard weighing 1.27 kg. The keyboard is sturdy and durable that gives the user a perfect tactile feel. The blue switches on this keyboard have a very detectable actuation point that helps programmers to code swiftly. Features: Full-size mechanical keyboard with 104 keys and 11 multimedia keys. Backlit keyboard with 10 LED night modes and 5 brightness adjustments levels. Double injection keycaps for a longer lifespan and a higher number of keystrokes. High-quality USB connector coupled with strong braided cable. TVS Gold Bharat Gold USB Keyboard TVS Gold Bharat programming keyboard comes with an array of 104 mechanical keys with long life switches. The keyboard also houses nine (9) vernacular languages to choose from, and also, an additional feature to select the interface – USB/PS2. Besides, the sculpted keypad gives the touch feeling with each click. Features: Guaranteed 50 Million plus strokes per key Highly reliable, with more than 200,000 Hrs MTBF An everlasting presence with Laser Etched Characters on Keycaps The option of working in two languages Fitted with mechanical switches for long life The keyboards are all enabled with the Rupee symbols Zebronics Zeb-Transformer-k USB Gaming Keyboard The Zeb-Transformer-k is a USB gaming keyboard with a multicolor LED effect. It has integrated media control, Laser keycaps, and an aluminum body. It also has a braided cable, high-quality USB connector, and backlight LED On/Off function. The keyboard comes with the interface of USB and a power requirement of DC 5V, <200mA. Moreover, it has a button stokes life of 80 million times. Features: Integrated Media control keys and multicolor LED with 4 modes – 3 Light Mode & 1 off Mode Windows Key Enable/Disable Function and all Keys Enable/Disable Function 2-Step Stand, Laser Keycaps, Aluminum Body, Backlight LED ON/OFF function Gold Plated USB, Braided Cable, modern design, and less power consumption. HyperX Alloy RGB Mechanical Gaming Keyboard The HyperX Alloy FPS RGB is a splendid, high-performance keyboard to ensure your skills and style are fully displayed. The robust stainless steel frame makes your keyboard stable as you pull the key to function, detect errors, or swap program scripts. The Alloy FPS RGB is designed for space-contracted setups, so you can maneuver easily without increasing your sensitivity to your mouse. It is also provided with a convenient USB load port and a braided, wear-resistant cable that makes portability easier. Features: RGB backlit keys with radiant lighting effects and a durable solid steel frame Advanced customization with HyperX NGENUITY software and onboard memory for three profiles Compact, ultra-portable design with detachable cable and convenient USB charge port Kailh Silver Speed mechanical key switches Game Mode, 100% Anti-ghosting, and N-Key Rollover functionalities Logitech G Prodigy G213 RGB Gaming Keyboard The Logitech Prodigy series offers advanced gaming-grade performance. Besides, for programmers, each keypress from fingers to screen is nearly instantaneous. It also accommodates the customization of five individual lighting zones with a range of over 16.8 million colors. Logitech Gaming Software can even synchronize lighting effects with other Logitech G devices for a real match system. Logitech G Prodigy allows users to work more quickly than with a standard keyboard thanks to high-performance keys, which combine the best touch and programming performance. Features: 4x faster gaming-grade performance than standard keyboards Crisp and brilliant RGB lighting with 16.8 Million color options Spill-resistant and highly durable to handle sudden accidents Dedicated media controls to play, pause, skip and adjust in one go Programmable function keys for custom commands and integrated palm rest and adjustable feet HyperX Alloy HX-KB5ME2-US Core RGB Membrane Gaming Keyboard The HyperX Alloy Core RGB is ideal for hardcore programmers and gamers looking to improve their keyboards’ style and performance without spending much money. The Alloy Core RGB is elegant, beautiful, and reliable, making it a sweeping tech keyboard for programmers. The Alloy Core RGB is designed to provide stability and reliability for players and programmers who want a keyboard that will last with an enduring, strengthened plastic framework. In addition, the keyboard lock allows you to lock the keyboard without setting your whole system up. Features: Signature light Bar and dynamic RGB lighting effects 5 Zones multicolor customization option Quiet and responsive keys with anti-ghosting Durable solid frame with spill resistance Spill-resistant and dedicated media controls Quick access buttons for brightness, lighting modes, and game mode Keyboard lock mode and flexible braided cable Comparison Table Conclusion This was the complete list of best keyboards for programming that we think are currently the best in the Indian market. However, many other keyboards can also be included, but we have picked these best keyboards for this article. As a matter of fact, it depends on the users’ choice and preference for what they find best in their hands. And this list of best programming keyboards will help you to compare and come to a final consensus. Cheers to programming life! The post 8 Best Keyboards for Programming in India 2025 appeared first on The Crazy Programmer.
-
Best Kodi Add-ons to Enhance Your Media Server Experience
by: Abhishek Kumar Kodi, by itself, is a robust and versatile media player, but it’s like a cake without frosting. The base is great, but what makes it truly delightful are the add-ons that enhance its functionality. Think of these add-ons as extensions that open up endless possibilities, from streaming movies and shows to accessing live sports, cartoons, music, and even cloud storage services. The best part? All the add-ons listed here work seamlessly with the latest release of Kodi with version 21 Omega. 💡Not sure how to install an add-on on Kodi? Check out our step-by-step guide on installing Kodi add-ons to get started. Whether you’re a movie buff, sports fanatic, anime lover, or someone who likes to keep their media library organized, there’s an add-on here for you. Let’s explore the best Kodi add-ons across various categories to supercharge your experience! 🚧Disclaimer: This guide is purely for educational purposes. While Kodi is a fantastic tool for media consumption, some add-ons may access copyrighted or pirated content, which could lead to legal consequences. Always use Kodi responsibly and adhere to the laws in your region. 1. AsgardAsgard is a standout Kodi add-on that has stood the test of time, remaining one of the top choices for streaming across a variety of content categories. Whether you're in the mood for movies, TV shows, documentaries, or even sports, Asgard has you covered. It offers both free streaming options and premium links through Real Debrid, ensuring smooth playback and a wide selection of content. Key featuresCompatible with Kodi 19 and 20. Provides HD streaming with Real Debrid support. Minimal buffering for a seamless viewing experience. Covers a broad range of genres, from movies and TV shows to documentaries and kids' content. Free streaming options are solid, though premium links offer better quality. Asgard 2. The CrewIt is another multi-purpose add-on that offers an extensive library, covering everything from popular TV shows and movies to live sports events. It’s highly recommended by Kodi users across forums for its reliability and frequent updates and it integrates seamlessly with Real Debrid for HD streaming, and its easy compatibility with Trakt makes it a favorite among Kodi users. Plus, it works flawlessly across all devices, making it a go-to option for any Kodi setup. Key featuresWorks on both old and new Kodi version (Omega). Real Debrid integration ensures HD-quality streams. Easily integrates with Trakt for syncing your watchlist and history. Fully compatible with any device, from desktop to mobile. Offers a wide selection of content, including movies, TV shows, sports, and more. The Crew 3. Magic DragonThe Magic Dragon is part of the EzzerMacs Wizard repository and is known for its ease of use and comprehensive library, this add-on automatically scrapes the best available streaming links, ensuring a smooth and hassle-free viewing experience. Whether you're a casual viewer or a seasoned Kodi user, The Magic Dragon is a go-to option for accessing a variety of content. Key featuresCompatible with Kodi version 19, 20 and 21. Automatically scrapes and selects the best streaming links. Offers a wide range of content, including TV channels, series, movies, and music. Covers all video genres, from entertainment shows to music videos. Magic Dragon 4. SerenSeren is another favorite among Kodi users who want reliable and high-quality streams. It’s part of the Nixgates repository and is known for its consistent performance. However, keep in mind that to fully enjoy Seren's offering, a paid Real Debrid account is necessary. Once you’re set up with Real Debrid, Seren provides access to a vast library of HD links for movies, TV shows, and more. The interface is clean and user-friendly, making it easy to browse and find content. Key featuresRequires a Real Debrid account for optimal functionality. Streams HD quality content with minimal buffering. Integrates effortlessly with Trakt to sync your watchlist and history. Offers a wide range of content across both kids' and adult genres. Seren 5. Fights on demandFights on Demand is known for its comprehensive library of combat sports content including boxing, wrestling, and MMA events, making it a go-to for fans of live face-offs and replays. It provides both free and Real Debrid streaming links from major combat sports streaming platforms, ensuring smooth and high-quality streams. Key featuresStreams live boxing, wrestling, and MMA events. Access to replays, including the latest UFC/MMA matches. Includes some Pay-Per-View (PPV) events. Offers both free and Real Debrid streaming options. Fight on deman 6. Daddy LiveAnother one for sports enthusiasts and live TV lovers, Daddy Live is a fantastic Kodi add-on. Coming from The Crew repository, the user-friendly interface is neatly organized into two main sections: Live Sports and Live TV. The Live TV section features a variety of channels, including news, lifestyle, entertainment, kids, travel, nature, and more. Key featuresHigh-quality live sports and TV streams. Wide variety of channels: news, entertainment, sports, kids, and more. Simple, easy-to-navigate interface. Reliable and buffer-free streaming. Daddy Live 7. WatchNixtoons2If you're a fan of anime, cartoons, or kid-friendly movies, WatchNixtoons2 is a must-have Kodi add-on. Hosted in the popular Crew repository, this add-on offers a fantastic collection of animated content for all ages. The add-on is easy to navigate, with sections such as Dubbed Anime, Subbed Anime, Popular & Ongoing Series, Movies, and Cartoons. One of its standout features is the ability to choose your preferred streaming resolution, allowing you to tailor the experience to your internet speed and device capabilities. Key featuresExtensive collection of anime, cartoons, and kid-friendly movies. Organized sections for dubbed, subbed, and ongoing anime series. Adjustable streaming resolution for optimal performance. Easy-to-use interface with a kid-friendly design. WatchNixtoons2 Other 'must have' utility add-onsEZ Maintenance+EZ Maintenance+ is a handy Kodi program add-on designed to help you maintain your Kodi installation and keep it running smoothly. Whether you're dealing with errors, slow performance, or just want to tidy up your system, this add-on provides a range of useful tools. With EZ Maintenance+, you can easily clear Kodi’s cache, back up or restore your Kodi setup, and even perform a complete wipe to reset the app to its default state. Whether you're a beginner or a seasoned Kodi user, this add-on simplifies the maintenance process and helps you avoid common issues that can arise from long-term use. The best part? that it's entirely free and safe to use. EZ Maintenance+ TraktIf you're not familiar with Trakt, it's a free service that helps you track the movies and TV shows you watch, share your viewing activity on social media, and even discover where certain content is available for streaming. While the add-on is free to use, you will need a Trakt account to take full advantage of its features. By connecting your Trakt account to Kodi, this add-on automatically syncs your watch history, keeping everything up to date across both platforms. It also offers the added benefit of cleaning up your Trakt collection to ensure it stays in sync with your Kodi library, making it a convenient tool for anyone who likes to stay organized and keep track of their viewing habits. Trakt Nord VPN NordVPN is a top choice for Kodi users, offering over 5,300 servers in 59 countries to bypass geo-restrictions. Its SmartPlay technology combines Smart DNS and IP addresses to ensure fast, secure streaming. With features like CyberSec to block malware and P2P servers for safe torrenting, NordVPN enhances your Kodi experience. It’s affordable, with a two-year plan costing just over $4 per month, and a 30-day money-back guarantee. NordVPN works on all major devices, allowing up to 10 simultaneous connections. NordVPN ConclusionUsing add-ons with Kodi can truly elevate your streaming setup. Add-ons like The Crew, Seren, and Magic Dragon offer a wealth of content, from HD movies and TV shows to live sports and anime, all tailored to fit your preferences. Real Debrid support, Trakt integration, and customizable streaming resolutions make these add-ons even more powerful, especially when paired with a VPN like NordVPN for security and geo-unblocking. However, it's important to remember that many of these add-ons come from third-party repositories, meaning some links could lead to unlicensed content. Always use caution, stay informed about local laws, and consider using a VPN for added privacy. Despite these risks, the benefits of having such a vast library of content at your fingertips make Kodi a fantastic platform for media consumption. If you're looking to take your Kodi experience even further, check out my list of best Kodi builds too. Best Kodi Builds to Spice Up Your Experience in 2025 Pimp your Kodi with a new skin and additional features by using one of the Kodi builds of your preference. It's FOSSAbhishek Kumar
-
A CSS-Only Star Rating Component and More! (Part 1)
by: Temani Afif Fri, 28 Feb 2025 14:03:32 +0000 Creating a star rating component is a classic exercise in web development. It has been done and re-done many times using different techniques. We usually need a small amount of JavaScript to pull it together, but what about a CSS-only implementation? Yes, it is possible! Here is a demo of a CSS-only star rating component. You can click to update the rating. CodePen Embed Fallback Cool, right? In addition to being CSS-only, the HTML code is nothing but a single element: <input type="range" min="1" max="5"> An input range element is the perfect candidate here since it allows a user to select a numeric value between two boundaries (the min and max). Our goal is to style that native element and transform it into a star rating component without additional markup or any script! We will also create more components at the end, so follow along. Note: This article will only focus on the CSS part. While I try my best to consider UI, UX, and accessibility aspects, my component is not perfect. It may have some drawbacks (bugs, accessibility issues, etc), so please use it with caution. The <input> element You probably know it but styling native elements such as inputs is a bit tricky due to all the default browser styles and also the different internal structures. If, for example, you inspect the code of an input range you will see a different HTML between Chrome (or Safari, or Edge) and Firefox. Luckily, we have some common parts that I will rely on. I will target two different elements: the main element (the input itself) and the thumb element (the one you slide with your mouse to update the value). Our CSS will mainly look like this: input[type="range"] { /* styling the main element */ } input[type="range" i]::-webkit-slider-thumb { /* styling the thumb for Chrome, Safari and Edge */ } input[type="range"]::-moz-range-thumb { /* styling the thumb for Firefox */ } The only drawback is that we need to repeat the styles of the thumb element twice. Don’t try to do the following: input[type="range" i]::-webkit-slider-thumb, input[type="range"]::-moz-range-thumb { /* styling the thumb */ } This doesn’t work because the whole selector is invalid. Chrome & Co. don’t understand the ::-moz-* part and Firefox doesn’t understand the ::-webkit-* part. For the sake of simplicity, I will use the following selector for this article: input[type="range"]::thumb { /* styling the thumb */ } But the demo contains the real selectors with the duplicated styles. Enough introduction, let’s start coding! Styling the main element (the star shape) We start by defining the size: input[type="range"] { --s: 100px; /* control the size*/ height: var(--s); aspect-ratio: 5; appearance: none; /* remove the default browser styles */ } If we consider that each star is placed within a square area, then for a 5-star rating we need a width equal to five times the height, hence the use of aspect-ratio: 5. CodePen Embed Fallback That 5 value is also the value defined as the max attribute for the input element. <input type="range" min="1" max="5"> So, we can rely on the newly enhanced attr() function (Chrome-only at the moment) to read that value instead of manually defining it! input[type="range"] { --s: 100px; /* control the size*/ height: var(--s); aspect-ratio: attr(max type(<number>)); appearance: none; /* remove the default browser styles */ } Now you can control the number of stars by simply adjusting the max attribute. This is great because the max attribute is also used by the browser internally, so updating that value will control our implementation as well as the browser’s behavior. This enhanced version of attr() is only available in Chrome for now so all my demos will contain a fallback to help with unsupported browsers. The next step is to use a CSS mask to create the stars. We need the shape to repeat five times (or more depending on the max value) so the mask size should be equal to var(--s) var(--s) or var(--s) 100% or simply var(--s) since by default the height will be equal to 100%. input[type="range"] { --s: 100px; /* control the size*/ height: var(--s); aspect-ratio: attr(max type(<number>)); appearance: none; /* remove the default browser styles */ mask-image: /* ... */; mask-size: var(--s); } What about the mask-image property you might ask? I think it’s no surprise that I tell you it will require a few gradients, but it could also be SVG instead. This article is about creating a star-rating component but I would like to keep the star part kind of generic so you can easily replace it with any shape you want. That’s why I say “and more” in the title of this post. We will see later how using the same code structure we can get a variety of different variations. Here is a demo showing two different implementations for the star. One is using gradients and the other is using an SVG. CodePen Embed Fallback In this case, the SVG implementation looks cleaner and the code is also shorter but keep both approaches in your back pocket because a gradient implementation can do a better job in some situations. Styling the thumb (the selected value) Let’s now focus on the thumb element. Take the last demo then click the stars and notice the position of the thumb. CodePen Embed Fallback The good thing is that the thumb is always within the area of a given star for all the values (from min to max), but the position is different for each star. It would be good if the position is always the same, regardless of the value. Ideally, the thumb should always be at the center of the stars for consistency. Here is a figure to illustrate the position and how to update it. The lines are the position of the thumb for each value. On the left, we have the default positions where the thumb goes from the left edge to the right edge of the main element. On the right, if we restrict the position of the thumb to a smaller area by adding some spaces on the sides, we get much better alignment. That space is equal to half the size of one star, or var(--s)/2. We can use padding for this: input[type="range"] { --s: 100px; /* control the size */ height: var(--s); aspect-ratio: attr(max type(<number>)); padding-inline: calc(var(--s) / 2); box-sizing: border-box; appearance: none; /* remove the default browser styles */ mask-image: ...; mask-size: var(--s); } CodePen Embed Fallback It’s better but not perfect because I am not accounting for the thumb size, which means we don’t have true centering. It’s not an issue because I will make the size of the thumb very small with a width equal to 1px. input[type="range"]::thumb { width: 1px; height: var(--s); appearance: none; /* remove the default browser styles */ } CodePen Embed Fallback The thumb is now a thin line placed at the center of the stars. I am using a red color to highlight the position but in reality, I don’t need any color because it will be transparent. You may think we are still far from the final result but we are almost done! One property is missing to complete the puzzle: border-image. The border-image property allows us to draw decorations outside an element thanks to its outset feature. For this reason, I made the thumb small and transparent. The coloration will be done using border-image. I will use a gradient with two solid colors as the source: linear-gradient(90deg, gold 50%, grey 0); And we write the following: border-image: linear-gradient(90deg, gold 50%, grey 0) fill 0 // 0 100px; The above means that we extend the area of the border-image from each side of the element by 100px and the gradient will fill that area. In other words, each color of the gradient will cover half of that area, which is 100px. CodePen Embed Fallback Do you see the logic? We created a kind of overflowing coloration on each side of the thumb — a coloration that will logically follow the thumb so each time you click a star it slides into place! Now instead of 100px let’s use a very big value: CodePen Embed Fallback We are getting close! The coloration is filling all the stars but we don’t want it to be in the middle but rather across the entire selected star. For this, we update the gradient a bit and instead of using 50%, we use 50% + var(--s)/2. We add an offset equal to half the width of a star which means the first color will take more space and our star rating component is perfect! CodePen Embed Fallback We can still optimize the code a little where instead of defining a height for the thumb, we keep it 0 and we consider the vertical outset of border-image to spread the coloration. input[type="range"]::thumb{ width: 1px; border-image: linear-gradient(90deg, gold calc(50% + var(--s) / 2), grey 0) fill 0 // var(--s) 500px; appearance: none; } We can also write the gradient differently using a conic gradient instead: input[type="range"]::thumb{ width: 1px; border-image: conic-gradient(at calc(50% + var(--s) / 2), grey 50%, gold 0) fill 0 // var(--s) 500px; appearance: none; } I know that the syntax of border-image is not easy to grasp and I went a bit fast with the explanation. But I have a very detailed article over at Smashing Magazine where I dissect that property with a lot of examples that I invite you to read for a deeper dive into how the property works. The full code of our component is this: <input type="range" min="1" max="5"> input[type="range"] { --s: 100px; /* control the size*/ height: var(--s); aspect-ratio: attr(max type(<number>)); padding-inline: calc(var(--s) / 2); box-sizing: border-box; appearance: none; mask-image: /* ... */; /* either an SVG or gradients */ mask-size: var(--s); } input[type="range"]::thumb { width: 1px; border-image: conic-gradient(at calc(50% + var(--s) / 2), grey 50%, gold 0) fill 0//var(--s) 500px; appearance: none; } That’s all! A few lines of CSS code and we have a nice rating star component! Half-Star Rating What about having a granularity of half a star as a rating? It’s something common and we can do it with the previous code by making a few adjustments. First, we update the input element to increment in half steps instead of full steps: <input type="range" min=".5" step=".5" max="5"> By default, the step is equal to 1 but we can update it to .5 (or any value) then we update the min value to .5 as well. On the CSS side, we change the padding from var(--s)/2 to var(--s)/4, and we do the same for the offset inside the gradient. input[type="range"] { --s: 100px; /* control the size*/ height: var(--s); aspect-ratio: attr(max type(<number>)); padding-inline: calc(var(--s) / 4); box-sizing: border-box; appearance: none; mask-image: ...; /* either SVG or gradients */ mask-size: var(--s); } input[type="range"]::thumb{ width: 1px; border-image: conic-gradient(at calc(50% + var(--s) / 4),grey 50%, gold 0) fill 0 // var(--s) 500px; appearance: none; } The difference between the two implementations is a factor of one-half which is also the step value. That means we can use attr() and create a generic code that works for both cases. input[type="range"] { --s: 100px; /* control the size*/ --_s: calc(attr(step type(<number>),1) * var(--s) / 2); height: var(--s); aspect-ratio: attr(max type(<number>)); padding-inline: var(--_s); box-sizing: border-box; appearance: none; mask-image: ...; /* either an SVG or gradients */ mask-size: var(--s); } input[type="range"]::thumb{ width: 1px; border-image: conic-gradient(at calc(50% + var(--_s)),gold 50%,grey 0) fill 0//var(--s) 500px; appearance: none; } Here is a demo where modifying the step is all that you need to do to control the granularity. Don’t forget that you can also control the number of stars using the max attribute. CodePen Embed Fallback Using the keyboard to adjust the rating As you may know, we can adjust the value of an input range slider using a keyboard, so we can control the rating using the keyboard as well. That’s a good thing but there is a caveat. Due to the use of the mask property, we no longer have the default outline that indicates keyboard focus which is an accessibility concern for those who rely on keyboard input. For a better user experience and to make the component more accessible, it’s good to display an outline on focus. The easiest solution is to add an extra wrapper: <span> <input type="range" min="1" max="5"> </span> That will have an outline when the input inside has focus: span:has(:focus-visible) { outline: 2px solid; } Try to use your keyboard in the below example to adjust both ratings: CodePen Embed Fallback Another idea is to consider a more complex mask configuration that prevents hiding the outline (or any outside decoration). The trick is to start with the following: mask: conic-gradient(#000 0 0) exclude, conic-gradient(#000 0 0) no-clip; The no-clip keyword means that nothing from the element will be clipped (including outlines). Then we use an exclude composition with another gradient. The exclusion will hide everything inside the element while keeping what is outside visible. Finally, we add back the mask that creates the star shapes: mask: /* ... */ 0/var(--s), conic-gradient(#000 0 0) exclude, conic-gradient(#000 0 0) no-clip; I prefer using this last method because it maintains the single-element implementation but maybe your HTML structure allows you to add focus on an upper element and you can keep the mask configuration simple. It totally depends! CodePen Embed Fallback Credits to Ana Tudor for the last trick! More examples! As I said earlier, what we are making is more than a star rating component. You can easily update the mask value to use any shape you want. Here is an example where I am using an SVG of a heart instead of a star. CodePen Embed Fallback Why not butterflies? CodePen Embed Fallback This time I am using a PNG image as a mask. If you are not comfortable using SVG or gradients you can use a transparent image instead. As long as you have an SVG, a PNG, or gradients, there is no limit on what you can do with this as far as shapes go. We can go even further into the customization and create a volume control component like below: CodePen Embed Fallback I am not repeating a specific shape in that last example, but am using a complex mask configuration to create a signal shape. Conclusion We started with a star rating component and ended with a bunch of cool examples. The title could have been “How to style an input range element” because this is what we did. We upgraded a native component without any script or extra markup, and with only a few lines of CSS. What about you? Can you think about another fancy component using the same code structure? Share your example in the comment section! Article series A CSS-Only Star Rating Component and More! (Part 1) A CSS-Only Star Rating Component and More! (Part 2) — Coming March 7! A CSS-Only Star Rating Component and More! (Part 1) originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
LHB Linux Digest #25.04: Self-host VPN, Swap Size Change, Crontab Logs and More
by: Abhishek Prakash Fri, 28 Feb 2025 19:22:01 +0530 What career opportunities are available for someone starting with Linux? I am talking about entering this field and that's why I left out roles like SRE from this list. I would appreciate your feedback on it if you are already working in the IT industry. Let's help out our juniors. What Kind of Job Can You Get if You Learn Linux?While there are tons of job roles created around Linux, here are the ones that you can choose for an entry level career.Linux HandbookAbhishek PrakashHere are the other highlights of this edition of LHB Linux Digest: Zed IDEEssential Docker commandsSelf hosted project management toolAnd more tools, tips and memes for youThis edition of LHB Linux Digest newsletter is supported by PikaPods.📖 Linux Tips and TutorialsFinding the biggest files and directories so that you can see what's taking all that disk spaceList only directories, not files (sometimes, you need to do that)Checking Crontab logs so that you can troubleshootLearn to increase (or perhaps decrease) swap on Ubuntu Linux. This should work on other distros too if they use swap file instead of swap partition. How to Increase Swap Size on Ubuntu LinuxIn this quick tip, you’ll learn to increase the swap size on Ubuntu and other Linux distributions.Linux HandbookAbhishek Prakash This post is for subscribers only Subscribe now Already have an account? Sign in
-
FOSS Weekly #25.09: Modern Terminals, RSS Matter, Linux Gaming Tested in 2025 and More
by: Abhishek Prakash If you are starting to use and learn Linux, remember this: Linux is not magic 🪄 It's sudo science 🔬 Okay...sorry... my dad jokes urges get the better of me at times 😁 💬 Let's see what else you get in this edition Cropping a video in VLC (no, seriously) Cloning SD card in Raspberry Pi Modern terminals with modern features And other Linux news, tips, and, of course, memes! This edition of FOSS Weekly is supported by PikaPods. 📰 Linux and Open Source NewsDietPi's new release supports Pi-hole v6 Nextcloud Hub 10 is available now Mozilla introduces 'terms of use' for Firefox Answering the difficult question. Is Linux any better for gaming in 2025? Is Linux Ready For Mainstream Gaming In 2025? Linux is quietly gaining ground on Windows in the gaming space. But how well does it actually perform? Here’s what I experienced. It's FOSS NewsSourav Rudra 🧠 What We’re Thinking About The RSS feed matters more than ever. Why I Still Love and Use RSS Feeds in 2025 RSS feeds are classic. And surprisingly, they are still relevant in 2025. It's FOSS NewsAbhishek 🧮 Linux Tips, Tutorials and More Cropping a video in VLC: is that even a thing? See the devices connected to your local network on Linux Although I prefer using yay, here are some other AUR helpers, Arch users. Here are some modern Linux terminals with not-so-traditional features. 7 Linux Terminals From the Future Just when I thought the terminals cannot be innovated, there is an influx of modern terminal emulators with interesting new features. It's FOSSAbhishek Prakash 👷 Maker's and AI Corner The easiest way to back up your Raspberry Pi is by cloning it. Am I right? Clone Existing Raspberry Pi OS to a Bigger SD Card Need more space on your Pi? How about cloning it to a bigger SD card? Here’s how to do that. It's FOSSAbhishek Prakash ✨ Apps highlight Alright! Obsidian is not open source but it is awesome. Obsidian Review: Notion Alternative for the Markdown Pros This second brain tool has taken the first brain of Markdown lovers by storm. It's FOSSAbhishek Prakash 🛍️ Deal Ending Soon And I know there is Logseq, its open source alternative. Between you and me, we have a tutorial series planned on Logseq, covering its features and tips on using it. 15 Linux and DevOps books for just $18 plus your purchase supports Code for America organization. Get them on Humble Bundle. Humble Tech Book Bundle: Linux from Beginner to Professional by O’Reilly Learn Linux with ease using this library of coding and programming courses by O’Reilly. Pay what you want & support Code For America. Humble Bundle 📽️ Video I am Creating for YouIt's a small topic but often confuses the Arch beginners. Subscribe to It's FOSS YouTube Channel 🧩 Quiz TimeTest your Linux file permission knowledge by taking this quiz. Linux File Permission The Linux file permission is an important concept to know about. Test your knowledge. It's FOSSAbhishek Prakash 💡 Quick Handy TipIn Nautilus file manager (GNOME's file explorer), you can use the Shortcut CTRL + S to start a quick "Select Items Matching". In the dialog box, enter the glob pattern matching, like *.png to select all PNG files, or *.txt to match all txt files. 🤣 Meme of the WeekI laughed harder than I should have on this meme. If you know Linux Mint, you would laugh too. And if you are interested, learn the logic behind the codenames of popular distro releases. 🗓️ Tech TriviaThe first web browser was introduced by Tim Berners-Lee, the creator of the World Wide Web on 26th Feb 1991. It was named WorldWideWeb at first but renamed later to Nexus to avoid the confusion. 🧑🤝🧑 FOSSverse CornerFOSSers are discussing the future 🖲️ In 50 years, what will our computers look like? Imagine, it’s the mid-term future. What will desktop computers look like? What specs will they have? It's FOSS Communityxahodo ❤️ With loveShare 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 😄
-
Using & Styling the Details Element
by: Geoff Graham Wed, 26 Feb 2025 16:07:14 +0000 You can find the <details> element all over the web these days. We were excited about it when it first dropped and toyed with using it as a menu back in 2019 (but probably don’t) among many other experiments. John Rhea made an entire game that combines <details> with the Popover API! Now that we’re 5+ years into <details>, we know more about it than ever before. I thought I’d round that information up so it’s in one place I can reference in the future without having to search the site — and other sites — to find it. The basic markup It’s a single element: <details> Open and close the element to toggle this content. </details> CodePen Embed Fallback That “details” label is a default. We can insert a <summary> element to come up with something custom: <details> <summary>Toggle content</summary> Open and close the element to toggle this content. </details> CodePen Embed Fallback From here, the world is sorta our oyster because we can stuff any HTML we want inside the element: <details> <summary>Toggle content</summary> <p>Open and close the element to toggle this content.</p> <img src="path/to/image.svg" alt=""> </details> The content is (sorta) searchable The trouble with tucking content inside an element like this is that it’s hidden by default. Early on, this was considered an inaccessible practice because the content was undetected by in-page searching (like using CMD+F on the page), but that’s since changed, at least in Chrome, which will open the <details> element and reveal the content if it discovers a matched term. That’s unfortunately not the case in Firefox and Safari, both of which skip the content stuffed inside a closed <details> element when doing in-page searches at the time I’m writing this. But it’s even more nuanced than that because Firefox (testing 134.0.1) matches searches when the <details> element is open, while Safari (testing 18.1) skips it altogether. That could very well change by the end of this year since searchability is one of the items being tackled in Interop 2025. So, as for now, it’s a good idea to keep important content out of a <details> element when possible. For example, <details> is often used as a pattern for Frequently Asked Questions, where each “question” is an expandable “answer” that reveals additional information. That might not be the best idea if that content should be searchable on the page, at least for now. CodePen Embed Fallback Open one at a time All we have to do is give each <details> a matching name attribute: <details name="notes"> <summary>Open Note</summary> <p> ... </p> </details> <details name="notes"> <!-- etc. --> </details> <details name="notes"> <!-- etc. --> </details> <details name="notes"> <!-- etc. --> </details> This allows the elements to behave a lot more like true accordions, where one panel collapses when another expands. CodePen Embed Fallback Style the marker The marker is that little triangle that indicates whether the <details> element is open or closed. We can use the ::marker pseudo-element to style it, though it does come with constraints, namely that all we can do is change the color and font size, at least in Chrome and Firefox which both fully support ::marker. Safari partially supports it in the sense that it works for ordered and unordered list items (e.g., li::marker), but not for <details> (e.g., summary::marker). Let’s look at an example that styles the markers for both <details> and an unordered list. At the time I’m writing this, Chrome and Firefox support styling the ::marker in both places, but Safari only works with the unordered list. CodePen Embed Fallback Notice how the ::marker selector in that last example selects both the <details> element and the unordered list element. We need to scope the selector to the <details> element if we want to target just that marker, right? /* This doesn't work! */ details::marker { /* styles */ } Nope! Instead, we need to scope it to the <summary> element. That’s what the marker is actually attached to. /* This does work */ summary::marker { /* styles */ } You might think that we can style the marker even if we were to leave the summary out of the markup. After all, HTML automatically inserts one for us by default. But that’s not the case. The <summary> element has to be present in the markup for it to match styles. You’ll see in the following demo that I’m using a generic ::marker selector that should match both <details> elements, but only the second one matches because it contains a <summary> in the HTML. Again, only Chrome and Firefox support for the time being: CodePen Embed Fallback You might also think that we can swap out the triangle for something else since that’s something we can absolutely do with list items by way of the list-style-type property: /* Does not work! */ summary::marker { list-style-type: square; } …but alas, that’s not the case. An article over at web.dev says that it does work, but I’ve been unsuccessful at getting a proper example to work in any browser. CodePen Embed Fallback That isn’t to say it shouldn’t work that way, but the specification isn’t explicit about it, so I have no expectations one way or another. Perhaps we’ll see an edit in a future specification that gets specific with <details> and to what extent CSS can modify the marker. Or maybe we won’t. It would be nice to have some way to chuck the triangle in favor of something else. And what about removing the marker altogether? All we need to do is set the content property on it with an empty string value and voilà! CodePen Embed Fallback Once the marker is gone, you could decide to craft your own custom marker with CSS by hooking into the <summary> element’s ::before pseudo-element. CodePen Embed Fallback Just take note that Safari displays both the default marker and the custom one since it does not support the ::marker pseudo-element at the time I’m writing this. You’re probably as tired reading that as I am typing it. 🤓 Style the content Let’s say all you need to do is slap a background color on the content inside the <details> element. You could select the entire thing and set a background on it: details { background: oklch(95% 0.1812 38.35); } That’s cool, but it would be better if it only set the background color when the element is in an open state. We can use an attribute selector for that: details[open] { background: oklch(95% 0.1812 38.35); } OK, but what about the <summary> element? What if you don’t want that included in the background? Well, you could wrap the content in a <div> and select that instead: details[open] div { background: oklch(95% 0.1812 38.35); } CodePen Embed Fallback What’s even better is using the ::details-content pseudo-element as a selector. This way, we can select everything inside the <details> element without reaching for more markup: ::details-content { background: oklch(95% 0.1812 38.35); } There’s no need to include details in the selector since ::details-content is only ever selectable in the context of a <details> element. So, it’s like we’re implicitly writing details::details-content. CodePen Embed Fallback The ::details-content pseudo is still gaining browser support when I’m writing this, so it’s worth keeping an eye on it and using it cautiously in the meantime. Animate the opening and closing Click a default <details> element and it immediately snaps open and closed. I’m not opposed to that, but there are times when it might look (and feel) nice to transition like a smooth operator between the open and closed states. It used to take some clever hackery to pull this off, as Louis Hoebregts demonstrated using the Web Animations API several years back. Robin Rendle shared another way that uses a CSS animation: details[open] p { animation: animateDown 0.2s linear forwards; } @keyframes animateDown { 0% { opacity: 0; transform: translatey(-15px); } 100% { opacity: 1; transform: translatey(0); } } He sprinkled in a little JavaScript to make his final example fully interactive, but you get the idea: CodePen Embed Fallback Notice what’s happening in there. Robin selects the paragraph element inside the <details> element when it is in an open state then triggers the animation. And that animation uses clever positioning to make it happen. That’s because there’s no way to know exactly how tall the paragraph — or the parent <details> element — is when expanded. We have to use explicit sizing, padding, and positioning to pull it all together. But guess what? Since then, we got a big gift from CSS that allows us to animate an element from zero height to its auto (i.e., intrinsic) height, even if we don’t know the exact value of that auto height in advance. We start with zero height and clip the overflow so nothing hangs out. And since we have the ::details-content pseudo, we can directly select that rather than introducing more markup to the HTML. ::details-content { transition: height 0.5s ease, content-visibility 0.5s ease allow-discrete; height: 0; overflow: clip; } Now we can opt into auto-height transitions using the interpolate-size property which was created just to enable transitions to keyword values, such as auto. We set it on the :root element so that it’s available everywhere, though you could scope it directly to a more specific instance if you’d like. :root { interpolate-size: allow-keywords; } Next up, we select the <details> element in its open state and set the ::details-content height to auto: [open]::details-content { height: auto; } We can make it so that this only applies if the browser supports auto-height transitions: @supports (interpolate-size: allow-keywords) { :root { interpolate-size: allow-keywords; } [open]::details-content { height: auto; } } And finally, we set the transition on the ::details-content pseudo to activate it: ::details-content { transition: height 0.5s ease; height: 0; overflow: clip; } /* Browser supports interpolate-size */ @supports (interpolate-size: allow-keywords) { :root { interpolate-size: allow-keywords; } [open]::details-content { height: auto; } } CodePen Embed Fallback But wait! Notice how the animation works when opening <details>, but things snap back when closing it. Bramus notes that we need to include the content-visibility property in the transition because (1) it is implicitly set on the element and (2) it maps to a hidden state when the <details> element is closed. That’s what causes the content to snap to hidden when closing the <details>. So, let’s add content-visibility to our list of transitions: ::details-content { transition: height 0.5s ease, content-visibility 0.5s ease allow-discrete; height: 0; overflow: clip; } /* Browser supports interpolate-size */ @supports (interpolate-size: allow-keywords) { :root { interpolate-size: allow-keywords; } [open]::details-content { height: auto; } } That’s much better: CodePen Embed Fallback Note the allow-discrete keyword which we need to set since content-visibility is a property that only supports discrete animations and transitions. Interesting tricks Chris has a demo that uses <details> as a system for floating footnotes in content. I forked it and added the name attribute to each footnote so that they close when another one is opened. CodePen Embed Fallback I mentioned John Rhea’s “Pop(over) The Balloons” game at the top of these notes: CodePen Embed Fallback Bramus with a slick-looking horizontal accordion forked from another example. Note how the <details> element is used as a flex container: CodePen Embed Fallback Chris with another clever trick that uses <details> to play and pause animated GIF image files. It’s doesn’t actually “pause” but the effect makes it seem like it does. CodePen Embed Fallback Ryan Trimble with styling <details> as a dropdown menu and then using anchor positioning to set where the content opens. CodePen Embed Fallback References HTML Living Standard (Section 4.11.1) by WHATWG “Quick Reminder that Details/Summary is the Easiest Way Ever to Make an Accordion” by Chris Coyier “A (terrible?) way to do footnotes in HTML” by Chris Coyier “Using <details> for Menus and Dialogs is an Interesting Idea” by Chris Coyier “Pausing a GIF with details/summary” by Chris Coyier “Exploring What the Details and Summary Elements Can Do” by Robin Rendle “More Details on <details>“ by Geoff Graham “::details-content“ by Geoff Graham “More options for styling <details>“ by Bramus “How to Animate the Details Element Using WAAPI” by Louis Hoebregts “Details and summary” by web.dev Using & Styling the Details Element originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
Using & Styling the Details Element
by: Geoff Graham Wed, 26 Feb 2025 16:07:14 +0000 You can find the <details> element all over the web these days. We were excited about it when it first dropped and toyed with using it as a menu back in 2019 (but probably don’t) among many other experiments. John Rhea made an entire game that combines <details> with the Popover API! Now that we’re 5+ years into <details>, we know more about it than ever before. I thought I’d round that information up so it’s in one place I can reference in the future without having to search the site — and other sites — to find it. The basic markup It’s a single element: <details> Open and close the element to toggle this content. </details> CodePen Embed Fallback That “details” label is a default. We can insert a <summary> element to come up with something custom: <details> <summary>Toggle content</summary> Open and close the element to toggle this content. </details> CodePen Embed Fallback From here, the world is sorta our oyster because we can stuff any HTML we want inside the element: <details> <summary>Toggle content</summary> <p>Open and close the element to toggle this content.</p> <img src="path/to/image.svg" alt=""> </details> The content is (sorta) searchable The trouble with tucking content inside an element like this is that it’s hidden by default. Early on, this was considered an inaccessible practice because the content was undetected by in-page searching (like using CMD+F on the page), but that’s since changed, at least in Chrome, which will open the <details> element and reveal the content if it discovers a matched term. That’s unfortunately not the case in Firefox and Safari, both of which skip the content stuffed inside a closed <details> element when doing in-page searches at the time I’m writing this. But it’s even more nuanced than that because Firefox (testing 134.0.1) matches searches when the <details> element is open, while Safari (testing 18.1) skips it altogether. That could very well change by the end of this year since searchability is one of the items being tackled in Interop 2025. So, as for now, it’s a good idea to keep important content out of a <details> element when possible. For example, <details> is often used as a pattern for Frequently Asked Questions, where each “question” is an expandable “answer” that reveals additional information. That might not be the best idea if that content should be searchable on the page, at least for now. CodePen Embed Fallback Open one at a time All we have to do is give each <details> a matching name attribute: <details name="notes"> <summary>Open Note</summary> <p> ... </p> </details> <details name="notes"> <!-- etc. --> </details> <details name="notes"> <!-- etc. --> </details> <details name="notes"> <!-- etc. --> </details> This allows the elements to behave a lot more like true accordions, where one panel collapses when another expands. CodePen Embed Fallback Style the marker The marker is that little triangle that indicates whether the <details> element is open or closed. We can use the ::marker pseudo-element to style it, though it does come with constraints, namely that all we can do is change the color and font size, at least in Chrome and Firefox which both fully support ::marker. Safari partially supports it in the sense that it works for ordered and unordered list items (e.g., li::marker), but not for <details> (e.g., summary::marker). Let’s look at an example that styles the markers for both <details> and an unordered list. At the time I’m writing this, Chrome and Firefox support styling the ::marker in both places, but Safari only works with the unordered list. CodePen Embed Fallback Notice how the ::marker selector in that last example selects both the <details> element and the unordered list element. We need to scope the selector to the <details> element if we want to target just that marker, right? /* This doesn't work! */ details::marker { /* styles */ } Nope! Instead, we need to scope it to the <summary> element. That’s what the marker is actually attached to. /* This does work */ summary::marker { /* styles */ } You might think that we can style the marker even if we were to leave the summary out of the markup. After all, HTML automatically inserts one for us by default. But that’s not the case. The <summary> element has to be present in the markup for it to match styles. You’ll see in the following demo that I’m using a generic ::marker selector that should match both <details> elements, but only the second one matches because it contains a <summary> in the HTML. Again, only Chrome and Firefox support for the time being: CodePen Embed Fallback You might also think that we can swap out the triangle for something else since that’s something we can absolutely do with list items by way of the list-style-type property: /* Does not work! */ summary::marker { list-style-type: square; } …but alas, that’s not the case. An article over at web.dev says that it does work, but I’ve been unsuccessful at getting a proper example to work in any browser. CodePen Embed Fallback That isn’t to say it shouldn’t work that way, but the specification isn’t explicit about it, so I have no expectations one way or another. Perhaps we’ll see an edit in a future specification that gets specific with <details> and to what extent CSS can modify the marker. Or maybe we won’t. It would be nice to have some way to chuck the triangle in favor of something else. And what about removing the marker altogether? All we need to do is set the content property on it with an empty string value and voilà! CodePen Embed Fallback Once the marker is gone, you could decide to craft your own custom marker with CSS by hooking into the <summary> element’s ::before pseudo-element. CodePen Embed Fallback Just take note that Safari displays both the default marker and the custom one since it does not support the ::marker pseudo-element at the time I’m writing this. You’re probably as tired reading that as I am typing it. 🤓 Style the content Let’s say all you need to do is slap a background color on the content inside the <details> element. You could select the entire thing and set a background on it: details { background: oklch(95% 0.1812 38.35); } That’s cool, but it would be better if it only set the background color when the element is in an open state. We can use an attribute selector for that: details[open] { background: oklch(95% 0.1812 38.35); } OK, but what about the <summary> element? What if you don’t want that included in the background? Well, you could wrap the content in a <div> and select that instead: details[open] div { background: oklch(95% 0.1812 38.35); } CodePen Embed Fallback What’s even better is using the ::details-content pseudo-element as a selector. This way, we can select everything inside the <details> element without reaching for more markup: ::details-content { background: oklch(95% 0.1812 38.35); } There’s no need to include details in the selector since ::details-content is only ever selectable in the context of a <details> element. So, it’s like we’re implicitly writing details::details-content. CodePen Embed Fallback The ::details-content pseudo is still gaining browser support when I’m writing this, so it’s worth keeping an eye on it and using it cautiously in the meantime. Animate the opening and closing Click a default <details> element and it immediately snaps open and closed. I’m not opposed to that, but there are times when it might look (and feel) nice to transition like a smooth operator between the open and closed states. It used to take some clever hackery to pull this off, as Louis Hoebregts demonstrated using the Web Animations API several years back. Robin Rendle shared another way that uses a CSS animation: details[open] p { animation: animateDown 0.2s linear forwards; } @keyframes animateDown { 0% { opacity: 0; transform: translatey(-15px); } 100% { opacity: 1; transform: translatey(0); } } He sprinkled in a little JavaScript to make his final example fully interactive, but you get the idea: CodePen Embed Fallback Notice what’s happening in there. Robin selects the paragraph element inside the <details> element when it is in an open state then triggers the animation. And that animation uses clever positioning to make it happen. That’s because there’s no way to know exactly how tall the paragraph — or the parent <details> element — is when expanded. We have to use explicit sizing, padding, and positioning to pull it all together. But guess what? Since then, we got a big gift from CSS that allows us to animate an element from zero height to its auto (i.e., intrinsic) height, even if we don’t know the exact value of that auto height in advance. We start with zero height and clip the overflow so nothing hangs out. And since we have the ::details-content pseudo, we can directly select that rather than introducing more markup to the HTML. ::details-content { transition: height 0.5s ease, content-visibility 0.5s ease allow-discrete; height: 0; overflow: clip; } Now we can opt into auto-height transitions using the interpolate-size property which was created just to enable transitions to keyword values, such as auto. We set it on the :root element so that it’s available everywhere, though you could scope it directly to a more specific instance if you’d like. :root { interpolate-size: allow-keywords; } Next up, we select the <details> element in its open state and set the ::details-content height to auto: [open]::details-content { height: auto; } We can make it so that this only applies if the browser supports auto-height transitions: @supports (interpolate-size: allow-keywords) { :root { interpolate-size: allow-keywords; } [open]::details-content { height: auto; } } And finally, we set the transition on the ::details-content pseudo to activate it: ::details-content { transition: height 0.5s ease; height: 0; overflow: clip; } /* Browser supports interpolate-size */ @supports (interpolate-size: allow-keywords) { :root { interpolate-size: allow-keywords; } [open]::details-content { height: auto; } } CodePen Embed Fallback But wait! Notice how the animation works when opening <details>, but things snap back when closing it. Bramus notes that we need to include the content-visibility property in the transition because (1) it is implicitly set on the element and (2) it maps to a hidden state when the <details> element is closed. That’s what causes the content to snap to hidden when closing the <details>. So, let’s add content-visibility to our list of transitions: ::details-content { transition: height 0.5s ease, content-visibility 0.5s ease allow-discrete; height: 0; overflow: clip; } /* Browser supports interpolate-size */ @supports (interpolate-size: allow-keywords) { :root { interpolate-size: allow-keywords; } [open]::details-content { height: auto; } } That’s much better: CodePen Embed Fallback Note the allow-discrete keyword which we need to set since content-visibility is a property that only supports discrete animations and transitions. Interesting tricks Chris has a demo that uses <details> as a system for floating footnotes in content. I forked it and added the name attribute to each footnote so that they close when another one is opened. CodePen Embed Fallback I mentioned John Rhea’s “Pop(over) The Balloons” game at the top of these notes: CodePen Embed Fallback Bramus with a slick-looking horizontal accordion forked from another example. Note how the <details> element is used as a flex container: CodePen Embed Fallback Chris with another clever trick that uses <details> to play and pause animated GIF image files. It’s doesn’t actually “pause” but the effect makes it seem like it does. CodePen Embed Fallback Ryan Trimble with styling <details> as a dropdown menu and then using anchor positioning to set where the content opens. CodePen Embed Fallback References HTML Living Standard (Section 4.11.1) by WHATWG “Quick Reminder that Details/Summary is the Easiest Way Ever to Make an Accordion” by Chris Coyier “A (terrible?) way to do footnotes in HTML” by Chris Coyier “Using <details> for Menus and Dialogs is an Interesting Idea” by Chris Coyier “Pausing a GIF with details/summary” by Chris Coyier “Exploring What the Details and Summary Elements Can Do” by Robin Rendle “More Details on <details>“ by Geoff Graham “::details-content“ by Geoff Graham “More options for styling <details>“ by Bramus “How to Animate the Details Element Using WAAPI” by Louis Hoebregts “Details and summary” by web.dev Using & Styling the Details Element originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
7 Linux Terminals From the Future
by: Abhishek Prakash Every Linux system comes with a terminal application, i.e. terminal emulators in correct technical terms. For many Linux users, it doesn't matter which terminal they use. I mean, you just run commands on it and it is the commands that matter, right? And yet, we have a huge number of terminals available. While the classics are focused on providing additional features like multiplexing windows, there is a new breed of terminals that offer GPU acceleration, AI and even flaunt that they are built on Rust 🦀 🚧 Modern solutions bring modern problems. Some of the options here are non-foss, some may even have telemetry enabled. I advise checking these things when you try any of the mentioned terminals here. 1. Wave Terminal Wave terminal Wave is an open-source cross-platform terminal emulator, that offers several unique features like graphical widgets. It feels like you are using an IDE like VS Code and that is in the good sense. Oh! It comes baked in with AI as well. Features of Wave TerminalIntegrated AI chat with support for multiple models Built-in editor for seamlessly editing local and remote files. Command Blocks for isolating and monitoring individual commands with auto-close options. File preview, that supports Markdown, images, video, etc. Custom themes, background images, etc. Inline Web browser. Overall, this terminal is the best fit for those who are looking for serious application development projects. Since most of the features are easily accessible, a relatively newer terminal user can also enjoy all the benefits. Install Wave TerminalUbuntu users can install Waveterm from the snap store. sudo snap install --classic waveterm The project also provides DEB, RPM and AppImage package formats. Download Wave Terminal 2. Warp Warp is a Rust-based terminal emulator, that offers built-in AI features and collaboration workflows. The AI agent answers your query and can even run commands for you. Like Wave, this too has an IDE-like feel, suitable for the new breed of developers and devops who dread the dark alleys of the command line. The workflow feature is useful for both individuals and teams. If you have different project scenarios where you must run one command after another, you can create workflows. It improves your efficiency. 🚧 Warp is not open source software. Features of Warp TerminalBuilt-in AI features like command lookup, AI autofill, command suggestions, chat with Warp AI, etc. IDE-like text editing, with mouse support. Markdown viewer with embedded command execution support. Collaboration workflow with Warp Drive. Extensive customization possibilities. Install Warp TerminalWarp provides DEB files for Ubuntu and other Debian-based systems. Download Warp Terminal There are also RPM and AppImage packages. 3. CognoCogno is a free and open-source terminal emulator, that offers several handy features like self-learning autocomplete. It is cross-platform and supports multiple shells, while allowing the user to customize according to individual preferences. And there are tons of themes that can be used. Perfect for a beautiful desktop screenshot to share in the communities. Features of CognoContext-aware autocompletion. Configurable shortcuts. Support for tabs, panes, and workspaces. Theme editor with preview function. Paste history, that allows to paste items that were pasted previously. Install CognoDEB and RPM installers are available in the official project download page. Download Cogno 4. RioRio is a hardware-accelerated GPU terminal emulator, written in Rust. It is intended to run as a native desktop application as well as a browser application. Rio Terminal Features of Rio TerminalHardware-accelerated, fast and written using Rust. Multi-windows and Split panels Image support: iTerm2 and Sixel image protocols. Supports hyperlinks. Vi Mode Install Rio TerminalRio offers separate DEB files for both X11 and Wayland. SO choose according to your specific needs. Download Rio Terminal There are installation instruction available for other distributions like Arch Linux, NixOS, etc. You can find those in the official installation instructions. 5. ContourContour is a GPU-accelerated modern terminal emulator with high-DPI support. This cross-platform terminal emulator focuses on speed, efficiency, and productivity. Contour Terminal Features of ContourGPU-Accelerated Terminal emulator with high-DPI support. Font ligature support. Complex Unicode support, including emojis. Runtime configuration reload Key binding customization VT320 Host-programmable and Indicator status line support Install Contour TerminalUbuntu and Debian-based distribution users can download the DEB file from official releases page. There is an AppImage package available as well. Download Contour Terminal If you are a Fedora user, you can install it directly from the official repository. sudo dnf install contour-terminal There is a detailed installation instructions for other platforms on the official documentation. 6. AlacrittyAlacritty is a modern terminal emulator, that offers heavy configuration capabilities. It is a GPU-accelerated terminal emulator, written on Rust. Alacritty Terminal Features of AlacrittyGPU accelerated terminal, written in Rust. Hyperlink support. Supports running multiple terminal emulators from the same Alacritty instance Vi mode Cross-platform support. Install AlacrittyAlacritty is fairly popular among Linux users. It is available in the default repositories of most distributions. For latest Ubuntu releases, you can install it using the apt command: sudo apt install alacritty 7. HyperHyper is a terminal emulator, built on open web standards. Written in Typescript, this extensible terminal focuses on speed and stability. If nothing else, it does look good. The screenshot below may not do justice. Hyper Terminal Features of HyperFunctionality can be extended with plugins available on NPM. Keymap customization Cross-platform support Customization capabilities using JavaScript configuration file. Install Hyper TerminalHyper offers DEB and RPM files for Debian-based and Fedora-based systems, respectively. Download Hyper There is also an AppImage package available. Bonus: KomandiKomandi is an AI-powered terminal command manager. Komandi is different from usual terminal emulators. This piece of software allows the user to create and store command snippets and run them on your preferred terminal emulator. 🚧 Komandi is not open source software. It requires you to purchase a license. I found it interesting and hence included it here. ConclusionI feel like I should have included Ghostty in this list of modern new terminal emulators. It's the talk of the terminal town, after all. However, I haven't tried it yet. I know, I am late to board the 'Ghost ship'. For a long time, the only new feature was often multiple terminal windows on the same screen and it was hard to believe that the scenario can be changed. It is interesting to see new terminals coming up with innovative features in the last few years. 💬 Tell me. Are you sticking with the classic terminals, or have switched to one of these modern ones?
-
Chris’ Corner: onChange
by: Chris Coyier Mon, 24 Feb 2025 18:00:59 +0000 There is an awful lot of change on the web. Sometimes the languages we use to build for the web change. Some of it comes from browsers themselves changing. An awful lot of it comes from ourselves. We change UIs and not always for the better. We build new tools. We see greener grass and we lust after it and chase it. Marco Rogers calls some of it a treadmill and has a hot take: Personally I wouldn’t cast as harsh of judgement that rewriting a front end is automatically wasted energy. Revisiting code, whatever the circumstances, can have helpful effects, like the person doing it actually understanding it. But I take the point. The success of a product likely has fairly little to do with the front-end framework at play and change for change sake isn’t exactly an efficient way to achieve success. The web doesn’t just have fits and spurts of change, it’s ever-changing. It’s just the nature of the teams and processes put around specs and browsers and the whole ecosystem really. The cool part about the web platform evolving is that you don’t have to care immediately. The web, gosh bless it, tends to be forgivingly backwards compatible. So staying on top of change largely means taking advantage of things that are easier to do now or a capability that didn’t exist before. One take on understanding evolving web features is Baseline, which is Google’s take on essentially a badge that shows you how practical it is to use a feature at a glance. Rachel Andrew’s talk Browser Support and The Rapidly Changing Web gets into this, but sadly I haven’t found a video of it yet. I have some critiques of Baseline (namely that it doesn’t help you know if a feature is usable through progressive enhancement or not) but largely it’s a win. Sometimes changes in a language cause massive sweeping movement. An example of this is the advent of ESM (ECMAScript Modules), that is, import and export in JavaScript. Seems small — is not small. Particularly because JavaScript also means Node ‘n’ friends, which needed an import mechanism, thus support require() (CJS format) for umpteen years, which is a bit of a different beast. So if you want to support ESM, that’s the future, but it means shipping Node modules in the dual CJS/EMS format, which is annoying work at best. Anthony Fu weighs in here with Move on to ESM-only, a controversial take, but much less so now that Node ships with the ability to require() an ESM file (vice versa would be even more magical). In some situations, sticking with the old actually does come with some cost. For instance, shipping “old” JavaScript (i.e. ES5) is slower, larger, and requires more compilation work. Philip Walton digs into the data there and has a solid conclusion: Best case scenario there is to compile code that looks at your chosen browser support targets, so it can evolve as the world does.
-
Applying the Web Dev Mindset to Dealing With Life Challenges
by: Lee Meyer Mon, 24 Feb 2025 13:42:16 +0000 Editor’s note: This article is outside the typical range of topics we normally cover around here and touches on sensitive topics including recollections from an abusive marriage. It doesn’t delve into much detail about the abuse and ends on a positive note. Thanks to Lee for sharing his take on the intersection between life and web development and for allowing us to gain professional insights from his personal life. When my dad was alive, he used to say that work and home life should exist in separate “watertight compartments.” I shouldn’t bring work home or my home life to work. There’s the quote misattributed to Mark Twain about a dad seeming to magically grow from a fool to a wise man in the few years it took the son to grow from a teen to an adult — but in my case, the older I get, the more I question my dad’s advice. It’s easy to romanticize someone in death — but when my dad wasn’t busy yelling, gambling the rent money, or disappearing to another state, his presence was like an AI simulating a father, throwing around words that sounded like a thing to say from a dad, but not helpful if you stopped to think about his statements for more than a minute. Let’s state the obvious: you shouldn’t do your personal life at work or work too much overtime when your family needs you. But you don’t need the watertight compartments metaphor to understand that. The way he said it hinted at something more complicated and awful — it was as though he wanted me to have a split personality. I shouldn’t be a developer at home, especially around him because he couldn’t relate, since I got my programming genes from my mum. And he didn’t think I should pour too much of myself into my dev work. The grain of truth was that even if you love your job, it can’t love you back. Yet what I’m hooked on isn’t one job, but the power of code and language. The lonely coder seems to free his mind at night Maybe my dad’s platitudinous advice to maintain a distance between my identity and my work would be practicable to a bricklayer or a president — but it’s poorly suited to someone whose brain is wired for web development. The job is so multidisciplinary it defies being put in a box you can leave at the office. That puzzle at work only makes sense because of a comment the person you love said before bedtime about the usability of that mobile game they play. It turns out the app is a competitor to the next company you join, as though the narrator of your life planted the earlier scene like a Chekov’s gun plot point, the relevance of which is revealed when you have that “a-ha” moment at work. Meanwhile, existence is so online that as you try to unwind, you can’t unsee the matrix you helped create, even when it’s well past 5 p.m. The user interface you are building wants you to be a psychologist, an artist, and a scientist. It demands the best of every part of you. The answer about implementing a complex user flow elegantly may only come to you in a dream. Don’t feel too bad if it’s the wrong answer. Douglas Crockford believes it’s a miracle we can code at all. He postulates that the mystery of how the human brain can program when he sees no evolutionary basis is why we haven’t hit the singularity. If we understood how our brains create software, we could build an AI that can program well enough to make a program better than itself. It could do that recursively till we have an AI smarter than us. And yet so far the best we have is the likes of the aptly named Github Copilot. The branding captures that we haven’t hit the singularity so much as a duality, in which humanity hopefully harmonizes with what Noam Chomsky calls a “kind of super-autocomplete,” the same way autotune used right can make a good singer sound better, or it can make us all sound like the same robot. We can barely get our code working even now that we have all evolved into AI-augmented cyborgs, but we also can’t seem to switch off our dev mindset at will. My dev brain has no “off” switch — is that a bug or a feature? What if the ability to program represents a different category of intelligence than we can measure with IQ tests, similar to neurodivergence, which carries unique strengths and weaknesses? I once read a study in which the researchers devised a test that appeared to accurately predict which first-year computer science students would be able to learn to program. They concluded that an aptitude for programming correlates with a “comfort with meaninglessness.” The researchers said that to write a program you have to “accept that whatever you might want the program to mean, the machine will blindly follow its meaningless rules and come to some meaningless conclusion. In the test, the consistent group showed a pre-acceptance of this fact.” The realization is dangerous, as both George Orwell and Philip K. Dick warned us. If you can control what words mean, you can control people and not just machines. If you have been swiping on Tinder and take a moment to sit with the feelings you associate with the phrases “swipe right” and “swipe left,” you find your emotional responses reveal that the app’s visual language has taught you what is good and what is bad. This recalls the scene in “Through the Looking-Glass,” in which Humpty Dumpty tells Alice that words mean what he wants them to mean. Humpty’s not the nicest dude. The Alice books can be interpreted as Dodgson’s critique of the Victorian education system which the author thought robbed children of their imagination, and Humpty makes his comments about language in a “scornful tone,” as though Alice should not only accept what he says, but she should know it without being told. To use a term that itself means different things to different people, Humpty is gaslighting Alice. At least he’s more transparent about it than modern gaslighters, and there’s a funny xkcd in which Alice uses Humpty’s logic against him to take all his possessions. Perhaps the ability to shape reality by modifying the consensus on what words mean isn’t inherently good or bad, but in itself “meaningless,” just something that is true. It’s probably not a coincidence the person who coined the phrases “the map is not the territory” and “the word is not the thing” was an engineer. What we do with this knowledge depends on our moral compass, much like someone with a penchant for cutting people up could choose to be a surgeon or a serial killer. Toxic humans are like blackhat hackers For around seven years, I was with a person who was psychologically and physically abusive. Abuse boils down to violating boundaries to gain control. As awful as that was, I do not think the person was irrational. There is a natural appeal for human beings pushing boundaries to get what they want. Kids do that naturally, for example, and pushing boundaries by making CSS do things it doesn’t want to is the premise of my articles on CSS-Tricks. I try to create something positive with my impulse to exploit the rules, which I hope makes the world slightly more illuminated. However, to understand those who would do us harm, we must first accept that their core motivation meets a relatable human need, albeit in unacceptable ways. For instance, more than a decade ago, the former hosting provider for CSS-Tricks was hacked. Chris Coyier received a reactivation notice for his domain name indicating the primary email for his account had changed to someone else’s email address. After this was resolved and the smoke cleared, Chris interviewed the hacker to understand how social engineering was used for the attack — but he also wanted to understand the hacker’s motivations. “Earl Drudge” (ananagram for “drug dealer”) explained that it was nothing personal that led him to target Chris — but Earl does things for“money and attention” and Chris reflected that “as different as the ways that we choose to spend our time are I do things for money and attention also, which makes us not entirely different at our core.” It reminds me of the trope that cops and criminals share many personality traits. Everyone who works in technology shares the mindset that allows me to bend the meaning and assumptions within technology to my will, which is why the qualifiers of blackhat and whitehat exist. They are two sides of the same coin. However, the utility of applying the rule-bending mindset to life itself has been recognized in the popularization of the term “life hack.” Hopefully, we are whitehat life hackers. A life hack is like discovering emergent gameplay that is a logical if unexpected consequence of what occurs in nature. It’s a conscious form of human evolution. If you’ve worked on a popular website, you will find a surprisingly high percentage of people follow the rules as long as you explain properly. Then again a large percentage will ignore the rules out of laziness or ignorance rather than malice. Then there are hackers and developers, who want to understand how the rules can be used to our advantage, or we are just curious what happens when we don’t follow the rules. When my seven-year-old does his online math, he sometimes deliberately enters the wrong answer, to see what animation triggers. This is a benign form of the hacker mentality — but now it’s time to talk about my experience with a lifehacker of the blackhat variety, who liked experimenting with my deepest insecurities because exploiting them served her purpose. Verbal abuse is like a cross-site scripting attack William Faulkner wrote that “the past is never dead. It’s not even past.” Although I now share my life with a person who is kind, supportive, and fascinating, I’m arguably still trapped in the previous, abusive relationship, because I have children with that person. Sometimes you can’t control who you receive input from, but recognizing the potential for that input to be malicious and then taking control of how it is interpreted is how we defend against both cross-site scriptingand verbal abuse. For example, my ex would input the word “stupid” and plenty of other names I can’t share on this blog. She would scream this into my consciousness again and again. It is just a word, like a malicious piece of JavaScript a user might save into your website. It’s a set of characters with no inherent meaning. The way you allow it to be interpreted does the damage. When the “stupid” script ran in my brain, it was laden with meanings and assumptions in the way I interpreted it, like a keyword in a high-level language that has been designed to represent a set of lower-level instructions: Intelligence was conflated with my self-worth. I believed she would not say the hurtful things after her tearful promises not to say them again once she was aware it hurt me, as though she was not aware the first time. I felt trapped being called names because I believed the relationship was something I needed. I believed the input at face value that my actual intelligence was the issue, rather than the power my ex gained over me by generating the reaction she wanted from me by her saying one magic word. Patching the vulnerabilities in your psyche My psychologist pointed out that the ex likely knew I was not stupid but the intent was to damage my self-worth to make me easy to control. To acknowledge my strengths would not achieve that. I also think my brand of intelligence isn’t the type she values. For instance, the strengths that make me capable of being a software engineer are invisible to my abuser. Ultimately it’s irrelevant whether she believed what she was shouting — because the purpose was the effect her words had, rather than their surface-level meaning. The vulnerability she exploited was that I treated her input as a first-class citizen, able to execute with the same privileges I had given to the scripts I had written for myself. Once I sanitized that input using therapy and self-hypnosis, I stopped allowing her malicious scripts to have the same importance as the scripts I had written for myself, because she didn’t deserve that privilege. The untruths about myself have lost their power — I can still review them like an inert block of JavaScript but they can’t hijack my self-worth. Like Alice using Humpty Dumpty’s logic against him in the xkcd cartoon, I showed that if words inherently have no meaning, there is no reason I can’t reengineer myself so that my meanings for the words trump how the abuser wanted me to use them to hurt myself and make me question my reality. The sanitized version of the “stupid” script rewrites those statements to: I want to hurt you. I want to get what I want from you. I want to lower your self-worth so you will believe I am better than you so you won’t leave. When you translate it like that, it has nothing to do with actual intelligence, and I’m secure enough to jokingly call myself an idiot in my previous article. It’s not that I’m colluding with the ghost of my ex in putting myself down. Rather, it’s a way of permitting myself not to be perfect because somewhere in human fallibility lies our ability to achieve what a computer can’t. I once worked with a manager who when I had a bug would say, “That’s good, at least you know you’re not a robot.” Being an idiot makes what I’ve achieved with CSS seem more beautiful because I work around not just the limitations in technology, but also my limitations. Some people won’t like it, or won’t get it. I have made peace with that. We never expose ourselves to needless risk, but we must stay in our lane, assuming malicious input will keep trying to find its way in. The motive for that input is the malicious user’s journey, not ours. We limit the attack surface and spend our energy understanding how to protect ourselves rather than dwelling on how malicious people shouldn’t attempt what they will attempt. Trauma and selection processes In my new relationship, there was a stage in which my partner said that dating me was starting to feel like “a job interview that never ends” because I would endlessly vet her to avoid choosing someone who would hurt me again. The job interview analogy was sadly apt. I’ve had interviews in which the process maps out the scars from how the organization has previously inadvertently allowed negative forces to enter. The horror trope in which evil has to be invited reflects the truth that we unknowingly open our door to mistreatment and negativity. My musings are not to be confused with victim blaming, but abusers can only abuse the power we give them. Therefore at some point, an interviewer may ask a question about what you would do with the power they are mulling handing you —and a web developer requires a lot of trust from a company. The interviewer will explain: “I ask because we’ve seen people do [X].” You can bet they are thinking of a specific person who did damage in the past. That knowledge might help you not to take the grilling personally. They probably didn’t give four interviews and an elaborate React coding challenge to the first few developers that helped get their company off the ground. However, at a different level of maturity, an organization or a person will evolve in what they need from a new person. We can’t hold that against them. Similar to a startup that only exists based on a bunch of ill-considered high-risk decisions, my relationship with my kids is more treasured than anything I own, and yet it all came from the worst mistake I ever made. My driver’s license said I was 30 but emotionally, I was unqualified to make the right decision for my future self, much like if you review your code from a year ago, it’s a good sign if you question what kind of idiot wrote it. As determined as I was not to repeat that kind of mistake, my partner’s point about seeming to perpetually interview her was this: no matter how much older and wiser we think we are, letting a new person into our lives is ultimately always a leap of faith, on both sides of the equation. Taking a planned plunge Releasing a website into the wild represents another kind of leap of faith — but if you imagine an air-gapped machine with the best website in the world sitting on it where no human can access it, that has less value than the most primitive contact form that delivers value to a handful of users. My gambling dad may have put his appetite for risk to poor use. But it’s important to take calculated risks and trust that we can establish boundaries to limit the damage a bad actor can do, rather than kid ourselves that it’s possible to preempt risk entirely. Hard things, you either survive them or you don’t. Getting security wrong can pose an existential threat to a company while compromising on psychological safety can pose an existential threat to a person. Yet there’s a reason “being vulnerable” is a positive phrase. When we create public-facing websites, it’s our job to balance the paradox of opening ourselves up to the world while doing everything to mitigate the risks. I decided to risk being vulnerable with you today because I hope it might help you see dev and life differently. So, I put aside the CodePens to get a little more personal, and if I’m right that front-end coding needs every part of your psyche to succeed, I hope you will permit dev to change your life, and your life experiences to change the way you do dev. I have faith that you’ll create something positive in both realms. Applying the Web Dev Mindset to Dealing With Life Challenges originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.
-
ResumeBuild
by: aiparabellum.com Mon, 24 Feb 2025 02:44:10 +0000 ResumeBuild.ai is a cutting-edge AI-powered resume builder trusted by over 1.4 million users globally. Designed to streamline the resume creation process, it simplifies job applications by crafting ATS-optimized resumes that increase your chances of landing interviews. Whether you’re a student, a professional looking for a career change, or an executive, ResumeBuild offers an intuitive platform to create tailored resumes, cover letters, resignation letters, and more. Powered by advanced GPT technology, it ensures your resume stands out and aligns with industry-specific best practices. Features of ResumeBuild AI ResumeBuild.ai offers a variety of features to help you create the perfect resume and enhance your job-seeking journey: AI Resume Writer: Generates professional, ATS-friendly resumes using AI technology to highlight your achievements. Mock Interview Tool: Prepares you for interviews by simulating real-world interview questions (coming soon). Job Search Assistance: Matches your resume with top hiring companies to make your job search more efficient (coming soon). Resume Optimizer: Analyzes your resume for missing content, overused buzzwords, and opportunities for improvement. AI Keyword Targeting: Enhances your resume by including industry-specific keywords to improve your interview rate. Real-Time Content Analysis: Identifies and corrects content pitfalls for a polished resume. Customizable Resume Templates: Access over 340+ templates tailored to various industries, including engineering, design, business, and medical fields. AI Cover Letter & Resignation Letter Generator: Creates personalized letters for specific job applications or career transitions. ATS Optimization: Ensures your resume is compatible with applicant tracking systems used by recruiters. Version Management & LinkedIn Importing: Easily manage multiple resume versions and import data directly from your LinkedIn profile. How It Works Using ResumeBuild.ai is simple and user-friendly: Select a Template: Choose from a wide range of free and premium templates designed to suit your industry and career level. Input Your Details: Add your personal information, professional experience, skills, and achievements. Customize with AI: Use the AI-powered tools to generate or refine bullet points, target keywords, and format your resume. Optimize Your Resume: Let the AI analyze your resume for ATS compliance and suggest improvements. Download and Apply: Export your resume in formats like PDF or DOCX and start applying for jobs. Benefits of ResumeBuild AI Using ResumeBuild.ai provides several advantages: Saves Time: Automates the resume creation process, saving hours of manual work. ATS-Friendly: Ensures your resume passes applicant tracking systems, increasing your chances of being shortlisted. Professional Quality: Delivers polished, industry-standard resumes tailored to your career goals. Enhanced Job Search: Boosts your interview rate with AI-optimized content and targeted keywords. Ease of Use: Intuitive interface makes it accessible for users of all skill levels. Customizable Options: Offers flexibility to create resumes for various industries and roles. Pricing ResumeBuild.ai offers several pricing plans to meet different user needs: Basic Plan (Free): Access to all basic features Standard resume formats One resume creation Three downloads Pro Plan ($29/month): Unlimited AI features and credits Unlimited downloads and resume creations Monthly resume reviews Priority support 30-day money-back guarantee Lifetime Plan ($129): One-time payment for lifetime access Unlimited AI features and downloads Priority support 30-day money-back guarantee Review ResumeBuild.ai has received rave reviews from users, with a stellar 4.8-star rating. Here’s what users are saying: “ResumeBuild has helped me a ton! It’s easy to customize for different job descriptions and gives an amazing edge in applications.” – Vivek T. A. “I used ResumeBuild.ai to create a new resume. It was simple, and the result was professional-looking. Two thumbs up!” – Jennifer F. “Really streamlined the resume-making process and made it effortless to build mine. Highly recommend!” – Niloufer T. “Great tool. I’ve seen a 300% increase in interview responses since using ResumeBuild.” – Harry S. These testimonials highlight the platform’s efficiency, user-friendliness, and ability to deliver results. Conclusion ResumeBuild.ai is the ultimate AI-powered resume builder for crafting professional, ATS-optimized resumes that stand out. With its intuitive interface, comprehensive features, and proven success rate, it serves as a one-stop solution for job seekers across industries. Whether you’re looking for your first job or aiming for career advancement, ResumeBuild.ai ensures your resume reflects your skills and achievements effectively. Start creating your resume today and secure your dream job with ease. Visit Website The post ResumeBuild appeared first on AI Parabellum.