w Spain-based DOMMA sees 350% YoY growth with WooCommerce and Google By woocommerce.com Published On :: Tue, 24 Sep 2024 12:31:25 +0000 How the wellness brand DOMMA achieved 350% year-over-year growth with one key tool. Can’t-miss success tips from a successful women-owned brand. Full Article Customer Stories
w Migrating from GoDaddy Website Builder to WooCommerce By woocommerce.com Published On :: Thu, 26 Sep 2024 09:00:00 +0000 Ready to migrate from GoDaddy to WooCommerce? 6 signs you should make the move. GoDaddy vs Woo comparison chart. Pros & cons. 3 ways to switch. Full Article Enterprise Ecommerce Sell Online
w Kellox and Maksimer: Speeding up 800,000 SKUs with WooCommerce By woocommerce.com Published On :: Mon, 30 Sep 2024 09:00:00 +0000 How one of Norway's largest importers migrated to WooCommerce and scaled an 800k SKU operation for a better user experience, performance, and results. Full Article Customer Stories Enterprise Ecommerce
w 2024 Black Friday trends: Top strategies from Woo stores and partners By woocommerce.com Published On :: Wed, 02 Oct 2024 14:08:11 +0000 Black Friday trends: Understand the best practices and favorite tools for your WooCommerce store's Black Friday marketing strategy. Full Article Enterprise Ecommerce Marketing Sell Online
w Ecommerce business models: Which is best for you? By woocommerce.com Published On :: Tue, 08 Oct 2024 14:21:25 +0000 Which ecommerce business model is best for your idea? Long-term and short-term strategies for operations, profits, and a successful launch. Full Article Business Ideas Sell Online
w How to find product manufacturers By woocommerce.com Published On :: Tue, 15 Oct 2024 20:32:25 +0000 Discover how to find the right product manufacturer, vet suppliers effectively, and use a checklist to ensure the best quality at the lowest costs. Full Article Sell Online Shipping
w How to choose an NFT and tokengating partner By woocommerce.com Published On :: Thu, 17 Oct 2024 10:00:00 +0000 How to navigate NFTs + the top considerations for choosing the right partner in this beginners guide for store owners. Full Article Enterprise Ecommerce Marketing Sell Online
w Prepare your checkout for the holidays: 5 ways to reduce cart abandonment with Amazon Pay By woocommerce.com Published On :: Thu, 17 Oct 2024 14:54:49 +0000 Make the most of the holiday shopping season — convert more visitors into customers. Quick changes that can make a big difference in 5 steps. Full Article Payments Sell Online
w What are digital products? How to sell them in 2024 By woocommerce.com Published On :: Thu, 24 Oct 2024 16:09:10 +0000 Are digital products more profitable? How does inventory work? Examples you can start selling fast! The best tools to sell digital products. Full Article Business Ideas Sell Online
w Competitive analysis — What to do before you commit to your next great business idea By woocommerce.com Published On :: Wed, 30 Oct 2024 13:46:55 +0000 Planning a new online business? Conduct a competitive analysis to understand your market, beat your rivals, and position your brand for success. Full Article Business Ideas Marketing Sell Online
w First time of Starboard Waterline SUP on Horsetooth Reservoir By photokayaker.fit2paddle.com Published On :: Fri, 16 Jun 2023 00:45:59 +0000 In mid-June, I went paddleboarding on Horsetooth Reservoir, starting from Soldier Cove in Lory State Park. I believe it is the shortest walk from the park to the water and puts you in the middle of somewhat protected and quiet […] Full Article SUP trip reports Horsetooth Reservoir paddleboard Starboard Waterline
w Summer paddling, swimming and photography on Horsetooth Reservoir By photokayaker.fit2paddle.com Published On :: Mon, 18 Sep 2023 22:51:02 +0000 Stand up paddling During August 2023 I visited Horsetooth Reservoir several times with Starboard Waterline SUP, the same board I paddled in the Missouri River 340 race. It was rather a relaxed paddling with a lot of photography since I […] Full Article SUP trip reports navigational lights open water swimming paddling swimming
w Florida to Colorado with 4Runner and Liteboat Rowing Shell By photokayaker.fit2paddle.com Published On :: Thu, 07 Dec 2023 16:47:03 +0000 In late November, I embarked on an 8-day trip from Colorado to Florida and back. The primary goal was to bring home a rowing shell and, of course, capture as many pictures and video clips as possible. I drove my […] Full Article boats trip reports 4runner Florida Liteboat Literace rowing rowing shell
w 5 Best WordPress Hosting Providers to Choose From By wphacks.com Published On :: Sun, 02 Jan 2022 08:00:00 +0000 It’s easy to underestimate the effect hosting has on how well your WordPress website operates. The right hosting plan can […] The post 5 Best WordPress Hosting Providers to Choose From appeared first on WPHacks. Full Article Beginners Guide web hosting wordpress hosting
w 40 Excellent Examples of Websites Using the Astra WordPress Theme (2022) By wphacks.com Published On :: Tue, 04 Jan 2022 07:51:00 +0000 Struggling to find the perfect theme for your new website? You’re not alone. There are countless options out there to […] The post 40 Excellent Examples of Websites Using the Astra WordPress Theme (2022) appeared first on WPHacks. Full Article Showcase
w The 10 Best WooCommerce Themes for WordPress (2022): Pros and Cons By wphacks.com Published On :: Tue, 04 Jan 2022 09:51:00 +0000 With so many WooCommerce themes available in the WordPress marketplace, it can be difficult to choose just one among the […] The post The 10 Best WooCommerce Themes for WordPress (2022): Pros and Cons appeared first on WPHacks. Full Article Showcase
w Divi vs Elementor: Which WordPress Page Builder Plugin to Use and Why By wphacks.com Published On :: Tue, 04 Jan 2022 12:56:00 +0000 Divi and Elementor are two of the most popular visual page builders for WordPress on the market. Both tools have […] The post Divi vs Elementor: Which WordPress Page Builder Plugin to Use and Why appeared first on WPHacks. Full Article Plugins
w 6 of the Best WordPress Landing Page Plugins for Your Website (2023) By wphacks.com Published On :: Fri, 07 Jan 2022 11:03:00 +0000 Do you need to create a high-converting landing page for your website? Thankfully, there are some well-developed WordPress landing page […] The post 6 of the Best WordPress Landing Page Plugins for Your Website (2023) appeared first on WPHacks. Full Article Showcase
w 6 Best WordPress Membership Plugins in 2023 (Pros and Cons) By wphacks.com Published On :: Sun, 01 Jan 2023 03:24:00 +0000 Looking for the best WordPress membership plugin to base your site on? It’s a big decision, and one you’ll be […] The post 6 Best WordPress Membership Plugins in 2023 (Pros and Cons) appeared first on WPHacks. Full Article Plugins
w How to Start a WordPress Blog (Ultimate Beginner’s Guide for 2023) By wphacks.com Published On :: Thu, 05 Jan 2023 08:00:00 +0000 Have you been wanting to share your ideas with the world at large and start a WordPress blog? Maybe you’ve […] The post How to Start a WordPress Blog (Ultimate Beginner’s Guide for 2023) appeared first on WPHacks. Full Article Beginners Guide start a blog start a wordpress blog wordpress beginner guide
w Elegant Themes Review 2024: Should You Invest in a Theme Club? By wphacks.com Published On :: Wed, 15 May 2024 08:00:00 +0000 Are you looking for affordable WordPress themes and plugins for your new website or blog? Sometimes you need a premium […] The post Elegant Themes Review 2024: Should You Invest in a Theme Club? appeared first on WPHacks. Full Article Reviews elegant themes elegant themes coupon
w Rock breakwater in Engure By xltphoto.net Published On :: Sun, 12 Jun 2016 13:14:36 +0000 Full Article Industrial abandoned Latvia mole old port rock sea seascape
w Wooden piles at Engure port By xltphoto.net Published On :: Tue, 14 Jun 2016 14:23:42 +0000 Full Article Travel abandoned Latvia object old port sea water
w Save Your Camera! Use a Wrist Strap By alphatracks.com Published On :: Thu, 04 Nov 2021 17:08:47 +0000 Save Your Camera! Use a Wrist Strap Vampires, monsters, zombies, dropping your camera. When it... The post Save Your Camera! Use a Wrist Strap appeared first on Alphatracks. Full Article review Tips & Tricks Alphatracks Photography Wrist Strap
w Never worry about your Sony Batteries Again with this Battery Magazine By alphatracks.com Published On :: Thu, 16 Dec 2021 15:56:21 +0000 Never worry about your Sony Batteries Again with this Battery Magazine The original design spec... The post Never worry about your Sony Batteries Again with this Battery Magazine appeared first on Alphatracks. Full Article Battery Tips & Tricks Accessories battery
w Sony NP-FW50 Batteries: Charge ’em without AC Power By alphatracks.com Published On :: Fri, 01 Apr 2022 18:51:24 +0000 Don’t lose a shot, Keep your Sony NP-FW50 batteries topped off, even without an AC... The post Sony NP-FW50 Batteries: Charge ’em without AC Power appeared first on Alphatracks. Full Article Battery equipment Tips & Tricks battery battery charger NP-FW50 power bank
w Create Better Images with Enhance and Super Resolution By alphatracks.com Published On :: Mon, 16 May 2022 12:24:28 +0000 If you haven’t used Adobe’s brand-new Enhance feature yet, I urge you to give it... The post Create Better Images with Enhance and Super Resolution appeared first on Alphatracks. Full Article Adobe Lightroom Digital Workflow Software Adobe Alphatracks Camera Raw Photography Tom Bonner
w No longer an Underdog, Sony cameras and lenses win multiple categories at TIPA 2022 World Awards By alphatracks.com Published On :: Sat, 04 Jun 2022 01:01:12 +0000 The Technical Image Press Association, otherwise known as TIPA, has just released its list of... The post No longer an Underdog, Sony cameras and lenses win multiple categories at TIPA 2022 World Awards appeared first on Alphatracks. Full Article E-Mount E-Mount Mirrorless Camera Sony Alpha Sony FE 24-70mm F2.8 Sony FE 70-200mm Sony ZV-E10 TIPA
w Biodiversity Isn’t Just Pretty: It Future-Proofs Our World By www.ecology.com Published On :: Fri, 19 Jan 2018 17:49:23 +0000 By Elizabeth Boakes Aeon A small boy hauls enthusiastically on his fishing rod. The line flies up and a needle-spined fish strikes him in the eye. Desperate to stay outdoors, he ignores the pain, but his sight deteriorates over the … Continue reading → Full Article Biodiversity biodiversity E.O. Wilson ecosystems
w World Turtle Day – 2018 By www.ecology.com Published On :: Tue, 22 May 2018 19:23:18 +0000 In its 18th year, World Turtle Day is celebrated around the world on May 23rd, bringing attention to the threats these ancient creatures face. Older than the dinosaurs, turtles have survived this long but their numbers have plummeted due to … Continue reading → Full Article Endangered Species Sea Turtles World Turtle Day
w The Bartlett Summer Show 2020 By www.designsnips.com Published On :: Fri, 09 Oct 2020 00:00:00 +0000 The Bartlett School of Architecture celebrates the work of 700 students with a virtual Summer Show exhibition featuring 32 3D exhibition rooms of ambitious and creative student work Full Article css winner Inspiration Web
w The Araw Collection By www.designsnips.com Published On :: Fri, 09 Oct 2020 00:00:00 +0000 Introducing Araw: a new modular jewelry collection brought by Limnia. Full Article awwwards Inspiration Web
w Is your idea worth doing? By www.viget.com Published On :: Wed, 15 May 2024 13:31:00 -0400 Have you ever been asked to get creative? Or told to think outside the box? If so, you might have had one of two reactions (or maybe a combination of the two):Hooray! No restrictions. Let’s go! Yikes! The possibilities are endless. Where do I start?Regardless of how you might react, it’s crucial to keep the original ask in mind — not “get creative,” but the reason you were charged with getting creative or thinking outside of the box in the first place. Losing sight of the goal or falling into the trap of thinking that a strategic approach isn’t actually “creative” are the fastest ways to the land of no progress and stifled creativity. I think the best ideas come out of a harmonious combination of strategic and creative thinking. I’m not the only one; product designers often have a foundations-first approach to their work where they consider a baseline strategy before jumping into high-fidelity mock-ups. Strategists leverage innovation workshops to both strategically and creatively problem solve. And developers weigh cost and functionality tradeoffs when designing and building reproducible and deployable systems.Problem solving, creative thinking, and focus are universal components of work-life – and life-life. Leveraging a tool to help you do all three isn’t a cop out, it's a way to help you get to the fun stuff (the ideas worth doing) faster. One tool that can help you confidently pursue your idea is an Impact and Feasibility Matrix, which will help you focus and narrow in. Your focus will keep you on track, and narrowing in on what ideas are worth doing will illuminate the way forward. Let’s dive in… FocusStep one is keeping your goal in mind. To do so, revisit these questions often:How does this help solve the problem?How does this contribute to an ideal outcome?Narrow InStep two is identifying which creative idea is worth pursuing. One way I like to narrow in and confidently move forward is by plotting ideas on an Impact + Feasibility matrix. Impact is:Reach. What percentage of your audience or stakeholders will be impacted by your idea?Relevance. Does your idea target your key audience? Longevity. How long will your idea impact your team? Feasibility is:Costs. What are your hard costs? This includes both the time investment and monetary investment. Ease. How easy is your idea to execute? Is this something you can tackle on your own? Will you need to outsource your idea to a partner or vendor? The answers to all of these will be unique to your role, the problem you are trying to solve, and your organization. That said, somewhere between impact and feasibility, usually in the upper right quadrant of the matrix, is your sweet spot. This is true regardless of role, problem, or organization. Ideas in the sweet spot are usually worth doing. They reach a relevant audience for your targeted time frame, they are achievable, and within budget. Your impact and feasibility matrix will be unique to each problem you are trying to solve. Let’s take a look at some real examples. ExamplesProblem: Help a newly distributed team settle in to working remotely. In the spring of 2020, many organizations (Viget included), were charged with supporting newly distributed teams. Throughout that year, we focused on surprising our team in new ways (think care packages containing branded sweatpants), removing barriers to communication, and improving access to resources (we implemented People Team office hours which we still keep to this day). We did send everyone their favorite candy and had local folks help deliver monitors to their teammates. We still don’t have Viget branded dog swag – maybe one day. Problem: Help team members get to know each other during weekly company-wide meetings. Each week, we host a company-wide all hands meeting. It’s a tradition we’ve kept since we were founded in 1999. The meeting has evolved over the years and so has our strategy for connection. This is a matrix we revisit often, some ideas we tweak and try again and others like requiring cameras-on or implementing a roll call isn’t something we would consider doing. To Sum It UpThe next time you find yourself spinning your wheels, or better yet, the next time you're tasked with thinking outside the box, focus first and plot your ideas on the impact/feasibility matrix. Doing so will help keep you on track and quickly narrow in on which ideas are worth pursuing. Full Article Process
w A Guide to Accessibility Resources for Global Accessibility Awareness Day By www.viget.com Published On :: Thu, 16 May 2024 11:26:00 -0400 Global Accessibility Awareness Day (GAAD) is May 16, 2024! GAAD was created to help bring attention and awareness to digital inclusivity. No matter your role on a project team, digital accessibility should always be a priority from start to finish. Why is accessibility so important?Over 1 billion people worldwide have a disability, and that number is growing every day15% of people with disabilities say they never go online, compared to 5% of people without disabilities, according to Pew Research CenterAccording to a survey by Click-Away Pound, 71% of disabled users are forced to leave a website if they find it difficult to useDigital accessibility directly impacts people’s ability to access information, buy products, apply for jobs, engage in discussion, and everything else that people do online that is becoming critical for modern life. Accessible spaces even benefit people without disabilities, as it allows anyone to take in content though their preferred method (reading the captions on a video instead of listening in a noisy environment, for example), and often breeds innovation as engineers work to find the best way to be sure everyone can access information equally.The World Wide Web Consortium (W3C) has developed the Web Content Accessibility Guidelines (WCAG) in an effort to standardize digital accessibility. However, many websites unfortunately fail to meet these standards, leading to a lesser-quality user experience. WebAIM’s yearly report has highlighted some surprising statistics about WCAG across the top 1,000,000 home pages:The most common accessibility failure across home pages is low contrast text98.1% of home pages have at least one WCAG 2.0 failureOn average, there are 56.8 accessibility errors per page (this increased 13.6% from 2023!) 16.8% of home pages had more than one <h1> tagAs you can see, there is still a lot of work that needs to be done to create a more accessible web for everyone. If you’re interested in learning more about digital accessibility and how to improve accessibility on your own projects, there are plenty of resources and online courses available. Resources range from free, to paid courses, to professional certifications. Below are some courses and resources that we recommend.Free Courses and ResourcesIf you’re looking to introduce yourself to digital accessibility, these free resources are a great place to start: A11ycasts with Rob Dodson - A series of video tutorials on YouTube that highlights topics including semantics, focus, the correct way to use a button, and a11y testingThe Beginner’s Guide to Web Accessibility - An article by Dequeue University that summarizes why digital accessibility should be a priority, and how to determine if your website is accessibleCommon Mistakes with Using Colour in Accessibility - Digital designer Andrée Lange provides insights into how to take color contrast into consideration when designing for the webDeque Accessibility Resources - Dequeue offers a variety of free accessibility resources, including webinars, blog posts, and their accessibility testing browser extension, axe DevToolsHTML Semantics and Accessibility Cheat Sheet - WebAIM provides a list of the most common HTML tags that have an impact on digital accessibilityMDN Accessibility Tutorials - MDN is an open-source project documenting web technologies, which also includes an informative section on web accessibility documentation and best practicesSection 508 ICT Testing Baseline - Outlines minimal accessibility testing requirements for federal agencies subject to Section 508WCAG 2.2 Quick Reference - WCAG are a series of web accessibility guidelines released and maintained by the W3C, with 2.2 being the current version of the guidelines. This page provides a reference to standards that websites should meet in order to meet current accessibility standardsWeb.dev Learn Accessibility Course - A series of informative articles ranging from beginning a11y topics, to more advanced topics including animation and motionDeep Dives with Paid TutorialsIf you’re a developer who has experience in accessibility and want to dig more into the topic, these comprehensive tutorials will help you improve your a11y knowledge:Accessible Web Academy - Accessible Web Academy includes more focused a11y courses for designers, developers, content creators, and marketers looking to target specific topics Inclusive Components - There is a free online summary of Heydon Pickering’s Inclusive Components, but you can also purchase an eBook on the topic. Heydon’s blog provides examples of a pattern library that bakes accessibility into each componentPractical Accessibility by Sara Soueidan - Sara Souedien is a prolific front-end developer who specializes in accessibility. Her course, Practical Accessibility, is a comprehensive guide for all developers, from those looking to familiarize themselves with accessibility, to experienced developers looking to expand their a11y knowledge.Advanced Knowledge with CertificationsIf you want to take the next step and become a certified professional in accessibility, IAAP offers professional certifications in digital accessibility:IAAP offers five certification options, CPACC, WAS, CPWA, ADS, and CPABEDeque University offers a curriculum to help prepare for IAAP certification examsThe Department of Homeland Security also offers a “Trusted Tester” certification for Section 508 complianceW3C offers a free Digital Accessibility Foundations course, with an optional verified certificate ($99) upon course completionAs the world’s population and number of disabled users continues to grow, it’s clear that implementing digital accessibility in your products is more important than ever. By implementing the information from these lists, you can help users of all abilities access the content that you share, ensuring a better internet for everyone. Full Article Code News & Culture Accessibility
w How Generative AI Can Add Human Delight to Your Virtual Event By www.viget.com Published On :: Wed, 29 May 2024 00:00:00 -0400 We just celebrated 24 years of Viget. That’s two dozen years! This year, our Spring TTT in celebration of “Viget24” was a virtual extravaganza. We’ve put on a lot of virtual events over the years. Some with really strong themes and swag bags; some that focus on simple, meaningful time together; and others that let us enjoy learning something new as a team. Regardless of the rest of the experience, a key component of all of our virtual events is joy, achieved often through intentional levity. We think it’s important to laugh together! We see laughter as a way to expedite connection, and connection leads to rapport which makes us better at collaborating — and in turn leads to more quality products for our clients. Experimenting and iterating is a critical way we try to continually get delight right. We’re pretty pleased with one of our experiments from Viget24 that we called “Lovely Spring Day”.A Lovely Spring DayAs we were brainstorming for this TTT, we thought about how to throw some joyful levity pizzazz into the pieces of our virtual events puzzle that have become pretty standard. How do we add lots of delight without adding lots of time to the action-packed schedule? We zeroed in on the virtual backgrounds we’ve been creating for every event — they add a layer of specialness. Of place. This isn’t any old virtual meeting. This is a TTT! A small collection of past event-specific virtual backgrounds Another key consideration for our team is figuring out creative ways to tie in inspiration from our industry and our work. AI has been an obvious contender — we’ve discussed it and tied it in to some extent for the past several TTTs. But this time, we wanted to see how we could use AI for delight — marrying it with virtual backgrounds felt obvious. And so, a ”Lovely Spring Day” was born. The TL;DR is that we generated custom virtual backgrounds for every Viget employee that encapsulates their “ideal spring day.” We then played a 15-minute guessing game where people tried to guess who the background “belonged to.” Then, people had access to the full folder of AI-generated virtual backgrounds to look through. Vigets could then choose the background that spoke to them most and set it as their background. Read on for more on how we put this together!Pre-Event SurveyTo support all of our TTTs, we send out thoughtful pre-event logistics surveys 2-3 weeks before the big day. The survey lets us know where folks are joining from (where can we send their activity + snack packages?) and gives folks a chance to provide input on how the People Team can help folks enjoy and be present for TTT. This time, we also snuck in three questions, just “for giggles.”In one sentence, describe your ideal spring day.List three things that spark joy.What color do you think suits you best?We did not share why we asked these questions. Sneaky, sneaky! When it’s low-key like this, the element of surprise is often a quick way to level up the delight.Asking for a FriendWith rich data in hand about what makes people happy in spring, we were ready to generate the backgrounds. I was stoked! I’ve been experimenting with ChatGPT for some time, so it was fun to be able to use the DALL-E 3 side of OpenAI’s GPT-4 model. Who knew Prompt Engineering would be part of my role as a recruiter-who-helps-support-TTT-planning? I played around with a couple different prompts to generate these background images. Ultimately, my goal was to create backgrounds that were meaningfully different from one another but still felt good (i.e., something you might feasibly want to set as your virtual background and nothing freakily AI, like uncanny valley hands).Here are the prompts I landed on that got me to our set of virtual backgrounds:Please generate an image (dimensions of a virtual meeting background) that encapsulates the vibe of a day with [ BLANK ].Please generate an image (dimensions of a virtual meeting background) that features [ BLANK ].In the blanks, I wrote the things people included in their surveys. Those blanks were filled with everything ranging from dogs, cats, and friends to beverages, specific temperatures, yard games, carbohydrates, hammocks and more! Sometimes, I’d include a detail I knew about that person myself, even if it wasn’t in their survey. Yes, I occasionally editorialized for both clarity and whimsy! This was for delight purposes, but also helped serve my goal of having the backgrounds be “meaningfully different from one another.” It’s amazing how many people’s ideal spring day is as simple as having 1) moderate temperatures and 2) no pollen!I generated 55 images. Throughout the process, DALL-E nailed it. I only needed to regenerate 2 or 3 images with clarifiers (and only because they included AI-specific outliers like disembodied hands). Huzzah!Here are some of my favorites, along with their prompts in the captions. Can you guess who they belong to? Please generate an image (dimensions of a virtual meeting background) that features an outdoor brewery/taproom in the appalachian mountains. There's a playground with kids in the very distance. In the foreground, frisbee, soccer, volleyball, etc. with friends and family. Please generate an image that encapsulates the vibe of a day ending with an outdoor dinner with lights near an outdoor shower. There should be some hiking boots scattered about. Please generate an image that features a nice hot bath after a cold but sunny day, with a beautiful mug of green tea and a box of takeout that looks really good. The calendar shows April 25th. Please generate an image that encapsulates the vibe of sitting outside in a nice purple adirondack chair with buc-ees paraphernalia around. Please generate an image that encapsulates the vibe of a sunny, 65 degree day with a slight breeze at the ballpark watching a game. The image should feature cats, baseball, and art. Please generate an image that encapsulates the vibe of being outside in a canoe along with carbs, bad jokes, and games (video OR board games). Please generate an image that features endless mountain bike trails, a blue bike with a cup of coffee in the cupholder, and roaming cats. IRLOk, so for the actual activity we had the images ready to go in a private Google Folder. I took twelve of the images and put them in a very simple deck. I shared my screen, introduced the activity, and invited people to guess who they think each image belonged to in Slack. It was so fun seeing people throw out guesses and then narrow in with any verbal hints I gave!Each image took about a minute. Then, we shared access to the Google Folder, gave folks a couple minutes to choose a background that called to them (their own image or someone else’s), and set it as their background. It felt like a magical moment to witness people finding and resonating with their own image or delighting in the ridiculousness of their coworkers’. We saved about 5 minutes for this piece, which felt right.The whole Lovely Spring Day activity took just over 15 minutes! It was a perfect way to transition from a long meal break into our next grouping of content. And, we got to see the different backgrounds throughout the rest of the meeting.Oh, the humanity!I think this activity was successful for a couple of reasons.1. People laughed! Color commentary in the #ttt Slack channel 2. People felt seen. Some of these backgrounds were incredibly on point. Some of that was due to key folks having well-documented interests and a Slack-Famous Dog. Laura Sweltz has a famous love of books and an incredibly iconic beagle named Phoebe. But some of it was due to the People Team knowing about our people — our coworkers — beyond the sentence they wrote in. This uniquely human involvement helped me call an audible as needed and tweak prompts slightly to make the backgrounds feel even more relatable. Steven, Carolyn, and Laura Sweltz felt seen. 3. We could commiserate about our eventual AI overlords. (Did you notice that I say “please” in my prompts?!) Listen, Viget has plenty of practical, healthily skeptical people who are dubious about AI. GenAI is not always a fun, lighthearted thing. But using it in a fun, lighthearted way to do something it’s really good at was a nice use case and thought-provoking exposure even for people who are not into it.4. We could see where we all align, and where we differ! It was amazing to see just how many people love picnics, covet their caffeine, and appreciate a bike ride. It was also cool to see some unique folks who simply crave a rainy spring day, or some beloved Buc-ee’s. What a rich tapestry of individuals — literally! Full Article News & Culture Employee Engagement Tooling
w Self-Host Your Identity Provider with authentik By www.viget.com Published On :: Fri, 31 May 2024 00:00:00 -0400 Authentication! What a hassle! Evans, where's that SAML from Earth!? You start off simple enough — username / password authentication in your application. Then, well, someone mentions that traditional passwords are a security vulnerability, so maybe we should use one-time passwords. That inevitably leads to discussions about magic links and multi-factor authentication. Next thing you know, one dev is in a corner, rocking back and forth and muttering something about SAML, and another dev just left — walked out the door, never to be seen again. Well, not to worry, we've got just the tool for you. authentik is an open-source identity provider written in Python. I'm going to focus on the self-hosted version, but they also offer a paid enterprise plan if you want some extra support. Self-Hosting The philosophy of open-source tools and self-hosting is a big, complex topic for another post. In the world of SaaS products, you likely don't need to self-host. I quite like hosted identity providers like Clerk and Auth0. They're good and appropriate solutions for different types of apps and companies. But I just love to self-host tools. Tinkering and toying with Docker, reverse proxies, and sometimes even server hardware is a lot of fun to me. It does add complexity in some (or many) places, but a little extra complexity means you've got a little more control over your tooling. Self-hosting also allows me to disconnect from the Internet and still be able to work on features and enhancements in my projects. As long as I've already installed the relevant packages or pulled the right Docker images, I can keep working if I'm in a place where I can't (or don't want to) connect to the Internet. This is a small thing, but really important to me. authentik makes it really easy to self-host your application. Right out of the gates, they provide a Docker Compose example and a Kubernetes example. Getting authentik running took me about 10 minutes using the Docker Compose example. Most of that was reading. This can make authentik a great tool during the proof-of-concept or beta phase of your application, getting authentication out of the way so you can focus on building the cool and unique features of your app. Integrations One of the great things that authentik has waiting for you is a bunch of documentation on integrating with a lot of tools you probably already use. These integrations range from other self-hosted apps like Outline (another favorite of mine) to cloud providers like AWS and even platforms like WordPress. authentik's integration docs show you how to set up authentik for your existing providers and applications, so no need to dig around for the right configuration. Sure, if you're building your own application, you don't have the luxury of a README (until you write one, of course!), but don't worry — all the documentation you'll need for your choice of providers is at your fingertips. Personally, I'm fan of the OAuth2 provider for most my pet projects, but I also find the Proxy Provider to be a really great tool if you want to secure a static site that doesn't have any means of authenticating users. Customization This is a pretty nice default login screen, but maybe a mountain road isn't your vibe. You can change this background, add your own company logo, and add your own CSS. Just add your static files to your authentik deployment and modify to your heart's content. But actually, that's not even the cool part of the customization to me. authentik has the concepts of Flows and Stages that are used to determine what steps a user should take to log in, log out, and more. First, you define Stages that represent a single step of authentication — something like requiring a user to enter their username or a password. There's a whole lot to choose from. Once you've set up your Stages, you'll create a Flow, stringing those Stages together until you have a complete process to authenticate, register, or even delete a user. Flows can be imported and exported as .yaml files, making it easy to keep your Flows and Stages synced between different environments. authentik comes with a pretty reasonable set of default Flows and Stages. If you're setting authentik up just to try it out, you might not need to add anything. They do have a couple of example Flows to get you started, though. Flows and Stages can feel pretty intimidating. On your dev server, I'd recommend basically deleting all of the default Flows and Stages and building up new ones from scratch. It's the easiest way to learn how these pieces fit together. If you accidentally break something in dev, you can always just drop your database and spin up a fresh install. Conclusion authentik is an awesome tool and I've only scratched the surface of what it can do for you. As a self-hosted identity provider, it gives you a lot of control on how your services are authenticated. It's great for local development and beyond, and it has a lot of ready-to-go integrations for services you might already use. If you're interested in further reading, I'd definitely recommend checking out the docs on Outposts and External Sources. Hopefully this has given you some inspiration to spin up a local instance of authentik and try it out! It will definitely simplify your authentication needs. Here's your SAML, Mr. Horrible Gelatinous Blob! Full Article Code Back-end Engineering Security
w Fluid Breakout Layout with CSS Grid By www.viget.com Published On :: Thu, 13 Jun 2024 09:23:00 -0400 So you're building a site and you've got a nice containing element around your content — but wait! Not all the content is the same width! That nice, neat tube of content is not so much a straight tube as a pile of different sized bricks. It's a common layout problem, but how do we account for these 'breakout' widths in the layout? There's a couple ways we could go about it: Encapsulate each component and set widths and margins. (Works fine if you have full control but can be fiddly). Force the component out of the containing element with negative margins. (Works fine if there's only a little deviation). Use CSS Grid to build a fluid universal grid! (????). That last one is what we'll be exploring: how to use CSS Grid definitions to allow for consistent component sizing across all breakpoints — no media queries required! This is a technique that's based on Ryan Mulligan's 'Layout Breakouts' which is based on Josh Comeau's 'Full-Bleed Layout' and is especially useful when creating a fully fluid layout. This also pairs well with fluid type techniques resulting in layouts that TRULY scale with the viewport size. Setting Up the Grid # Here's the layout we're going to be building: If we break apart the design, we've got 4 possible widths for components: Full-Width Feature Popout Content We've also go some special side-anchored elements that 'stick' to one of the screen edges but also honor the other element widths. We'll come back to these later on. Now that we've categorized the widths, lets start drawing column edges and defining areas: Left margin / Full-Width Left Feature Left Popout Center Content Right Popout Right Feature Right margin / Full-Width That's a lot of columns! Yet on mobile, we only need 3 columns, just left margin (1), center content (4), and right margin (7). We want some of these intermediate columns to disappear! Fortunately, CSS Grid gives us some powerful tools to create the measurements needed—yes, even for the disappearing columns! We won't even have to write any media queries for this one. We can make just ONE definition that works at all sizes. We'll store our measurements as CSS variables for easy use later on: :root { --gap: clamp(1rem, 4vw, 2rem); --full: minmax(var(--gap), 1fr); --feature: minmax(0, 12vw); --popout: minmax(0, 2rem); --content: min(clamp(30rem, 52vw, 60rem), 100% - var(--gap) * 2); } Let's break these down. --gap: clamp(1rem, 4vw, 2rem); gap will be our side margin, allowing it to stretch up to 2rem at max, with a preferred width of 4vw, but never going below 1rem. --full: minmax(var(--gap), 1fr); We're going to use the minmax() function for these next three measurements to say: "If there's room in the CSS Grid, you can expand out to here but then don't go smaller than the minimum". The full area is going to expand from left edge to right edge (remember we have to split the areas to allow for the other columns) and will double as our margin, so we'll pop in our gap value as our minimum and tell it that it can expand up to 1fr, or basically as much space as the rest of the grid will allow it. --feature: minmax(0, 12vw); --popout: minmax(0, 2rem); The feature and popout both have a minimum value of 0. This is what powers our disappearing columns! As other areas of the grid expand, these will collapse when there's no longer any room for them, essentially taking up no space. --content: min(clamp(30rem, 52vw, 60rem), 100% - var(--gap) * 2); And then finally, our content area is our most complex measurement. It's saying, take the minimum value of either: A fluid measurement that can be 30-60rem (with the help of clamp()) OR full width minus our gap value (but doubled for both left and right values). These measurements can be changed to fit the needs of your layout. Specifically the feature and popout maximum values and the first content value. For example, our use of vw for the feature means it will fluidly expand out as the screen grows whereas the popout will remain only 2rem larger on each side than the content column. Now we can assemble these measurements in a CSS grid column definition. We'll name our column edges with [custom-ident] and use the -start and -end endings to help make assignment easier later on. .grid-breakout { display: grid; grid-template-columns: [full-start] var(--full) [feature-start] var(--feature) [popout-start] var(--popout) [content-start] var(--content) [content-end] var(--popout) [popout-end] var(--feature) [feature-end] var(--full) [full-end]; } The definition is complex, but if we visualize the start and end lines of our columns as well as the measurements, it looks like this: You can see we have our middle content column, our disappearing feature and popout columns, and finally our full columns that double as our margin. To finish off the definitions, we need to create column assignments. Because we named our columns with custom identifiers and specified the start and stop lines, we don't have to fiddle with grid numbers. We can assign them directly like: .full { grid-column: full; } .feature { grid-column: feature; } .popout { grid-column: popout; } .content { grid-column: content; } And if we want to create a default assignment for elements in the grid (which is especially useful if you don't have full control over the markup) you can create one like this: .grid-breakout > * { grid-column: content; } Now you can attach any of these classes to components in your grid and have them snap to the width you want. Watch the screen capture below as the grid scales down. You can see the feature and popout columns disappearing as everything transitions to a mobile width, and then expands back up. A video showing how the intermediate columns collapse down to transition to the mobile layout and then expand as the window increases in width. You can see a demo of the base setup here: See the Pen Universal Breakout CSS Grid - Basic by Nathan Long (@nathanlong) on CodePen. Nesting Grids # Now let's go back to our header element. You can see that though the header is full-width, we actually want its inner content to honor the feature width. Fortunately, because of the flexible nature of this grid definition, we can repeat the definition and then continue using the same column names on the inner structure. Because our grid only goes one layer deep we're free to replicate as much as we need or even break out and use different layout methods for the component interiors. <main class="grid-breakout"> <section class="full grid-breakout"> <div class="feature"> <!-- inner content --> </div> </section> </main> You can see it in action here: See the Pen Universal Breakout CSS Grid - Basic by Nathan Long (@nathanlong) on CodePen. Anchoring Left and Right # Remember those side-anchored components? This is where we need to get a little tricky to line everything up. Going back to our diagram, we want an element to span MOST of the way across the page, but end at the opposite feature edge. We can reuse our column definitions for the first part. .feature-left { grid-template-columns: full-start / feature-end; } Great! That gives us exactly what we want... except for when we try to nest the grids. Our original grid definition assumes that our content, while different widths, is centered in the window. We have to rethink our inner grid definition a little bit. We're shaving off one end of the grid, specifically a full definition. So two things need to happen: We need to adjust our content width to now account for only having one gap. We need our new grid end to stop at the edge of the feature column. We can achieve this with a new measurement and a new grid definition: :root { /* previous definitions... */ --content-inset: min(clamp(30rem, 52vw, 60rem), 100% - var(--gap)); } .grid-breakout-feature-left { display: grid; grid-template-columns: [full-start] var(--full) [feature-start] var(--feature) [popout-start] var(--popout) [content-start] var(--content-inset) [content-end] var(--popout) [popout-end] var(--feature) [feature-end full-end]; } We've replaced the inner content measurement with the new value and combined the feature and full ends with the final line of the template column definition: [feature-end full-end] This will allow redefinition inside the new side-anchored component. You will notice that you'll need to supply your own padding for the inner as they no longer have that final margin to prevent it from reaching the new grid edge. <main class="grid-breakout"> <section class="feature-left grid-breakout-feature-left"> <div class="feature"> <!-- inner content --> </div> </section> </main> If you want to reverse this to be anchored to the right, you can flip the grid definition, moving the double start to the top like: .grid-breakout-feature-right { display: grid; grid-template-columns: [full-start feature-start] var(--feature) [popout-start] var(--popout) [content-start] var(--content-inset) [content-end] var(--popout) [popout-end] var(--feature) [feature-end] var(--full) [full-end]; } You can see a demo of the side-anchored component here: See the Pen Universal Breakout CSS Grid - Side-Anchored Elements by Nathan Long (@nathanlong) on CodePen. But What About Tailwind! # We love using Tailwind at Viget as a Team Accelerator™, and it's straightforward to implement these measurements and definitions in your Tailwind config. /** @type {import('tailwindcss').Config} */ import plugin from "tailwindcss/plugin"; export default { // the rest of your other definitions theme: { // the rest of your theme definitions extend: { gridColumn: { content: "content", popout: "popout", feature: "feature", full: "full", "feature-left": "full-start / feature-end", }, gridTemplateColumns: { breakout: `[full-start] var(--full) [feature-start] var(--feature) [popout-start] var(--popout) [content-start] var(--content) [content-end] var(--popout) [popout-end] var(--feature) [feature-end] var(--full) [full-end]`, "breakout-feature-left": `[full-start] var(--full) [feature-start] var(--feature) [popout-start] var(--popout) [content-start] var(--content-inset) [content-end] var(--popout) [popout-end] var(--feature) [feature-end full-end];`, }, }, }, plugins: [ plugin(function ({ addBase }) { addBase({ ":root": { // grid sizing variables "--gap": "clamp(1rem, 4vw, 2rem)", "--full": "minmax(var(--gap), 1fr)", "--content": "min(clamp(30rem, 52vw, 60rem), 100% - var(--gap) * 2)", "--popout": "minmax(0, 2rem)", "--feature": "minmax(0, 12vw)", "--content-inset": "min(clamp(30rem, 52vw, 60rem), 100% - var(--gap))", }, // force unspecified content blocks into 'content' grid ".grid-cols-breakout > *": { "grid-column": "content", }, }); }), ], }; Everything is effectively the same, but you'll call your grid classes like grid-cols-breakout to set the grid, and your columns like col-feature per Tailwind naming conventions. Forwards to a Fluid Future! # And there you have it! A media-query-less fluid breakout layout defined with CSS grid! While the setup is more complicated at first glance, I've found that the more fluid your layout rules are, the FEWER rules you have to write overall! Especially when paired with fluid type, dynamic viewport units, and all the amazing features that are landing in CSS — it's truly a fluid future! Full Article Code Front-end Engineering
w Building Magic with Webflow: A UI Developer's Perspective By www.viget.com Published On :: Mon, 17 Jun 2024 10:00:00 -0400 In the fast moving and constantly changing landscape of web development, codeless solutions like Webflow and Squarespace have emerged as an alternative to more traditional development. These platforms allow users to design and build websites through intuitive visual interfaces, and are viable solutions for many use cases out there. For the past several months, I've been working as a frontend development support specialist alongside one of our talented designers, Blair Culbreth, who is managing a large, established Webflow project. Here are my candid thoughts and impressions from this experience, along with some critical considerations for those looking to integrate Webflow into their own workflow. Spoiler alert: while Webflow has some impressive strengths, it also comes with limitations that can be both unexpected and frustrating at times.What Webflow Does Really WellSmall Team EfficiencyWebflow truly shines for smaller teams or products, especially those with limited resources. For a team that’s just a single designer or a small development crew, Webflow can help lower the technical debt involved with getting a website to production. By mitigating some of the more complex aspects of development such as responsive design, cross-browser compatibility, and hosting, teams are able to focus on other aspects of the site. This makes it a strong option for startups, freelancers, or small businesses looking to create professional-grade websites efficiently and effectively without the necessity of a developer.Animation ToolingWhen I say professional-grade websites, I’m talking about more than just functional designs. Webflow has some fantastic animation tooling making it incredibly simple to build rich, full-page animations and interactions without ever touching a line of code. Users can create scroll-bound animations or interactive moments of joy all from the comfort of a relatively simple and straightforward GUI. Through the use of animation keyframes, you can elevate a static site into something that feels modern and expensive. Heck, I could even see using the animation tooling itself as a prototyping tool for design handoff in a more traditional web development process. This ability to easily add sophisticated animations allows smaller teams to produce polished, dynamic websites that rival those created by much larger teams with dedicated development resources. Documentation & EducationBeyond its design capabilities, Webflow also stands out for its educational impact. The platform offers incredible documentation that covers core frontend principles, effectively bridging the divide between design and development. Through simple, digestible, and intuitive videos and written documentation, Webflow equips designers with knowledge that shores up many concepts and intricacies of web development.Working with Webflow provides designers with numerous takeaways they can apply to future projects, including those outside the realm of Webflow. The platform educates users on HTML structure, CSS styling properties, and responsive design. This deeper understanding of web development makes designers more versatile and effective in their roles and inherently benefits communication between designers and developers, as their thinking will be more aligned with one another.Navigating Webflow’s LimitationsClass StylesWebflow's class-based styling system is a standout feature, especially to those familiar with CSS. It allows you to bundle properties into classes and apply them efficiently across different elements, minimizing code duplication. When used effectively, this approach facilitates the creation of reusable styles and design systems; however, mastering it requires attention to detail, similar to working with CSS directly, which can be made challenging within the Webflow UI.Due to the separation of pages and content in Webflow, tracking down existing CSS classes and applying styles consistently throughout a project can be challenging. Keeping track of which class names apply what styles can be a struggle. While Webflow offers a Style Manager to help organize and manage classes, it can be difficult to use for quickly identifying how styles are being applied across the platform.Moreover, the inability to open multiple pages in designer mode at once presents a significant frustration. Without the ability to compare elements across different pages simultaneously, users may face challenges in ensuring consistency and troubleshooting design issues efficiently. This limitation may lead to a slower, more cumbersome workflow, particularly in larger projects where maintaining a coherent design system is critical.Another struggle with managing styles within the UI comes in the form of applying styles to combo classes. Combo classes are when you combine multiple classes together to create a variation or modified state of an element. Inadvertently applying styles to a combo class when intending to apply a style for the base class was a common issue I found myself running into, highlighting some challenges users should be aware of, especially when getting more familiar with Webflow.These challenges underscore the value of implementing a strong and consistent CSS class naming system, such as BEM (Block Element Modifier). Adhering to a standardized naming convention will help mitigate some of the challenges posed by Webflow's class-based styling system, but it does come with the added overhead of needing to learn a new class naming convention.Preset Web ElementsWebflow provides users with a diverse selection of default web elements, ranging from simple divs to intricate lightbox elements, which serve as the foundational building blocks for websites. These preset elements occasionally impose rigid structural constraints. For instance, when attempting to create a tabs menu with a filter, users may encounter a problem with adding additional elements to the tab menu block. This restriction forces users to either conform their design to Webflow’s constraints or devise creative workarounds to achieve their desired functionality.Navigating such limitations can be challenging, particularly when striving to realize a specific design vision. It may involve exploring alternative solutions or compromising on the original plan. Yet, as users gain familiarity with the platform, those limitations can be anticipated, allowing them to develop strategies to circumvent the constraints.Custom ScriptsOne of the most powerful aspects of Webflow is also one of the most challenging features to balance. It requires careful management to avoid issues like performance degradation and increased technical debt. It’s incredibly easy to have a website get bogged down with bloat, especially when a larger team might be working on a project.Webflow lacks a built-in feature to view all custom scripts at a glance, making it difficult to track and manage them. Maintaining a documented list of all custom scripts used in your project and detailing their purposes and locations can help mitigate this issue, but that’s a fair amount of overhead to maintain. Additionally, custom scripts do not function in Webflow’s editor mode, requiring a site deploy for testing and troubleshooting, which can be time-consuming. The ability to add custom scripts opens up a world of options, including third-party plugins and libraries that can expand Webflow's native features. Tools like Jetboost or Finsweet can help fill in the gaps, and are oftentimes worth the investment as they provide relatively easy-to-use integrations that will make for a better user experience.That’s all to say that applying custom scripts to a Webflow project is not necessarily bad, but should be approached with considerations on how to mitigate technical debt. Here are a few suggestions to help with integrating custom scripts into your Webflow project:Maximize Native Features: Use Webflow’s built-in features as much as possible. If a design can be achieved with Webflow’s interactions and animations, avoid adding custom JavaScript.External Development: Develop and test scripts in an external environment to reduce time spent deploying and debugging within Webflow.Reusable Components: Save frequently used custom code as reusable components to simplify maintenance and ensure consistency across the site.Regular Audits: Periodically review and clean up scripts to ensure that only necessary ones are loaded, improving site performance and maintainability.Mitigating Difficulty Through TeamworkI started this article by mentioning that I recently served as a frontend development support specialist alongside our designer, Blair, on this project. Blair took on the primary responsibility of building many of the pages, and I want to share more about our collaborative experience. Webflow is as close as you can get to building a traditionally coded website without necessarily needing to touch code, but that doesn’t mean there’s no value in having someone more familiar with the technical side of website building available. From accessibility considerations to complex layout structures, a lot of time can be saved by having a developer serve as a pseudo consultant on the project.On numerous occasions, Blair reached out to me to help set up more complex custom implementations that required JavaScript or weren’t coming together as expected. By being able to jump in and solve those issues quickly for Blair, she was able to focus on building out the other pages. Similarly, I was able to audit and review her work to ensure it was inclusive for all types of users.There are various development tricks we can implement to enhance user experiences for visually impaired users. For example, hiding text specific to a screen reader to provide greater context is a technique that a designer might not generally think about or even be aware of, but a good frontend developer would know to include. By being involved in the building process, I was able to highlight and advise on such instances, ensuring our project was accessible and user-friendly for everyone.ConclusionWebflow presents a robust solution for web development, particularly for smaller teams or projects with limited resources. Its intuitive visual interface and powerful animation tools enable the creation of professional-grade websites without the need for extensive coding knowledge. Webflow’s educational resources also empower designers to deepen their understanding of web development, bridging the gap between design and development and fostering better collaboration.Webflow is not without its limitations. The class-based styling system, while efficient, can be challenging to manage, and the need for site deployment to test custom scripts adds to both the complexity and time investment required to build a project. Despite these challenges, many of the difficulties can be mitigated through careful planning and teamwork. Leveraging native features, developing and testing scripts externally, and creating reusable components are all strategies that can help maintain site performance and manage technical debt.Collaborative efforts between designers and developers can further enhance the process, as seen in my experience working alongside Blair. This teamwork allows for efficient problem-solving and ensures that accessibility and user experience are prioritized throughout the project. By combining the strengths of Webflow with thoughtful collaboration and strategic planning, teams can create dynamic, user-friendly websites that meet modern standards. Full Article Design & Content Tooling
w Balancing Image Speed and Quality with imgix By www.viget.com Published On :: Tue, 18 Jun 2024 12:00:00 -0400 Users expect a website to load fast. An average web page loads in about 2.5 seconds. The longer the user has to wait, the higher the user bounce rate. There are a lot of factors that go into site speed, but images account for about 75% of the page weight on an application or website. Google’s Core Web Vitals uses several metrics to rank sites. Visual site speed or largest contentful paint affects ROI as slower sites have fewer repeat users and fewer sales.Without properly sized images, both site speed and image quality are affected. Accordingly, we use several methods to deliver properly sized images. Our primary solution is imgix because it is easy to implement and saves managers and clients time and effort. Imgix Key FeaturesImgix provides a lot of features — some we consistently use on projects, and others we use in very specific situations. Responsive ImagesSetting up responsive images can be complex. As the variety of devices and their screen resolutions continue to expand, managing all the different image requirements is increasingly challenging.Consider this scenario: a website’s images look crisp and clear on a high-resolution monitor. When that same page is viewed on a mobile device, the images are so large the page takes forever to load. A solution could be to upload a smaller image for mobile, right? It's not quite that simple. We need eight or more different sizes of the same image to account for different screen sizes and retina screens. Keeping track of all the image sizes and saving each size gets complex and would be nearly impossible to do manually on a site that has hundreds or thousands of images. One of our clients, National Park Foundation (NPF), wanted to clarify its message to better target major donors. Their gorgeous, large scenic images are essential to their website strategy. NPF needed the images throughout their site to be crisp and clear at all screen sizes. Using imgix, NPF content managers can load high-resolution images to the CMS and not worry about the site's speed or performance. They rely on imgix to deliver the correctly resized image for any user's screen.Imgix does this with their Device Pixel Ratio and Client Hints which automatically sets the pixel density for the image based on the user's device. Those API parameters can be easily set in the URLs for the image’s `srcset`. This allows developers to set an image width for an image `srcset` and then imgix delivers the right pixel ratio image to the user. We use `srcset` with imgix on other client sites like Bezos Earth Fund and Human Rights Campaign as well. Resize and CroppingImgix allows you to crop images in addition to setting an image’s focal point. So, only one image needs to be uploaded and it can be used at multiple sizes and croppings throughout the site. Let's say we upload a large landscape image, but on some pages we only need to use a portion of the image cropped as a square. Imgix will crop the image and deliver the smaller versions on the pages we need while persisting the larger versions on other pages.At Viget we use resizing and cropping on our own website, including our articles, to crop the staff photo to a smaller size at the top of the articles. This makes it possible for us to upload the staff photo once and the article image gets created automatically. Color Palette Another feature that we've used on client sites is the Color Palette API which allows you as many colors as you want from an image. For example, the Shedd Aquarium website that we built uses this feature by pulling a vibrant color from the image and setting it as the background color for the page hero. Aside from taking the manual work out of closely aligning photography with a page’s design, there’s an additional benefit: if you are on a slow connection, you will see a dynamic colored banner at the top before the image loads. Image UpscalingAnother valuable feature is the ability to upscale images. Even if you upload an image that is low resolution, it can still be used at a higher resolution. This is especially useful for e-commerce sites or applications where users are uploading their images. The upscale feature uses Generative AI to take a pixelated image and create a higher-resolution image. The final image will not be perfect, but it looks more professional. See the upscale demo on imgix. Non-upscaled image Upscaled image using Imgix PDF Preview ImagesThere is also a PDF page to image option in imgix. The API enables the generation of a page-specific image preview from the PDF, which can serve as both a thumbnail and a full-size preview. When we built AHIP.org, they had a resources section for their members containing quite a few PDFs. To help with clarity and findability, we used imgix to show previews of the PDF documents to non-members. This feature allows AHIP to upload resource PDFs without having to also upload any thumbnail images. Face DetectionAnother nice feature is a face detection parameter that you can pass to the API. This allows you to upload a photo and no matter the cropping or size it will keep the face as the focal point of the image. We used this feature on NEA for their team member page. It's great for user profile images that are used in different contexts throughout the site. Video StreamingVideos have become a key design element on websites. However, determining which service to use for embedding those videos is an ongoing topic of discussion. Video platforms enable you to integrate the video onto the page, yet they introduce scripts that may impede page loading speed. Imgix offers a video embed service that allows content managers to keep all the images and videos in one place. The videos are automatically encoded to Adaptive Bitrate Streaming to get the best compression and video quality. So, videos load fast and look great on mobile and desktop. Imgix Video API with Adaptive Bitrate Streaming Performance A lot of CMSs have image transformations built in. An image transformation encompasses everything for that image including responsive sizes, cropping, resizing, and face detection from the original. This is great for small sets of images, but transformations quickly get out of hand the more images there are on a site. For example, the homepage of the National Park Foundation has a minimum of 96 image transformations. Processing all of those image transformations uses a lot of server resources. Imgix saves the images and delivers them through their CDN. The imgix image CDN has an average of 0.15 milliseconds return on requests which enables images to load as quickly as possible. The CDN also caches the images on CDN edge nodes making them immediately available for future requests. FlexibilityImgix is flexible enough to work with almost any site structure; including WordPress, Craft CMS, Shopify, React, Ruby on Rails, Python, and more (see the full list). So, whether a site is a WordPress site or a Rails application, imgix fits right into the ecosystem. And, even better: you don’t have to rebuild your web app or website to gain the benefits of image performance, which can save you a lot of time and money.Setting up imgix on an existing website is easy. Imgix can connect to existing asset storage sources like AWS, Azure, or a web folder on the same domain. Once the image source is set up, a developer can start passing parameters to the API. CostImgix is free for 1,000 images which makes it easy to integrate and grow with your site. Pricing goes to $750/yr for 5,000 images and $3,000/yr for 25,000 images. In their pricing structure, “images” are categorized as origin images, so the count only includes original images and not transformed ones. So, you could have hundreds of images and thousands of image transformations all being delivered through a CDN for free. ConclusionEnsuring fast site speed isn't just important. It is vital. It's the cornerstone of a successful online presence, directly influencing search engine rankings, user satisfaction, and ultimately, your return on investment. Properly sized and optimized images are key to ensuring your site loads quickly and displays correctly for users across various devices.We have found that imgix enables our team to efficiently create projects with diverse image options, saving managers and developers valuable time. Our clients benefit from reduced server space and an increased site speed. Imgix’s API is comprehensive, so you can use one tool for all features and options around site images — from cropping and resizing to face detection and automated color palettes, to video and beyond. Having used imgix for the past five years to support the wide-ranging needs of our clients, we feel confident recommending it and using it again and again. Users expect a website to load fast, and imgix is a reliable way to make sure that happens. Full Article Code Front-end Engineering Content Management Performance
w Your Website Transition Checklist By www.viget.com Published On :: Thu, 20 Jun 2024 11:00:00 -0400 When onboarding a new partner to redesign your website, take over maintenance, or rescue a project going sideways, you'll need to carefully transition access to a variety of critical systems and tools. And if you're navigating a contentious relationship or onboarding into a new organization without documentation, you might not know where to start.Does that sound scary? It doesn't have to be. Here's a comprehensive checklist to ensure that you retain full control of your website and avoid any potential hiccups during a transition. Codebase access. Ensure you have ownership or administrative access to the existing codebase or code repository. Popular platforms like Bitbucket and GitHub are often used for this purpose.Content Management System access. Ensure you have the highest level of access (super admin) for your Content Management System (CMS). Hosting information and access. Gather all hosting information and ensure you have access to the account that owns the workspace. This is crucial to prevent unauthorized updates or changes to your site. For hosted platforms, you’ll need Owner access, not just Administrator access. Additional services information and access. This might include your domain registrar (e.g., GoDaddy), DNS settings, email services, your content delivery network (CDN), if applicable. This could also include any third-party services that are integrated with your website. Common examples might include: Algolia, Hubspot, Stripe, etc. Analytics and Data. Make sure you have access to all analytics tools used to monitor your website traffic and user behavior. This might include both old Google Universal Analytics data and current GA4 data, Google Tag Manager, or any other analytics services used on your website (e.g., Mixpanel, Hotjar, Adobe Analytics, etc.). Backups. Secure a full backup of your site, including the file system. Plugins like UpdraftPlus for WordPress can be very helpful for this process. Also, ensure you have backups of shared files, such as those in Google Drive, Box, or Dropbox.Design Assets. Retain copies of raw design assets (e.g., Figma files). We always transfer ownership of Figma files to our client teams to ensure they have the ability to extend the design system in the future.Licenses. Make sure you own any required licenses, such as font/photo licenses, CMS licenses, API keys, or premium plugins. We insist that our client teams purchase any required licenses/subscriptions using their corporate information so we’re never blocking access to those critical resources. Transitioning website partners can be a smooth process with foresight and preparation. While ideally there would never be gaps in access to these critical resources and services, by following this checklist, you can ensure that you’re not missing anything when offboarding old partners or getting your bearings with a new team or organization. Do you need help figuring out how this checklist might apply to your situation? Be in touch, and we’d be happy to discuss your current status and suggest next steps for your website transition. Full Article Strategy Process Project Management
w Handling Spelling Mistakes with Postgres Full Text Search By www.viget.com Published On :: Tue, 25 Jun 2024 12:37:00 -0400 Background # Postgres Full Text Search (FTS) is a great way to implement site search on a website running Postgres already, without requiring additional infrastructure. On a recent engagement with a client, we were deciding between Postgres FTS and ElasticSearch. Ultimately we chose FTS because we could spin it up without having to add extra infrastructure, as we would with ElasticSearch. Since the project was written in Ruby on Rails, we were able to use the excellent PgSearch gem to implement FTS in ActiveRecord. Multisearch # As we wanted a general site search, we needed to utilize multisearch. Multisearch combines multiple ActiveRecord models into one search 'document' table that you can search against. For example, if a user searches for some search term, and the search is configured for multisearch, then every single model that we mark as multisearchable will be searched for that term at the same time. See here for more detail. Search Features # PgSearch allows for different search features, tsearch, trigram, and dmetaphone. The default is tsearch, which uses the built-in Postgres Full Text Search. This was great for our use case, since it also comes with highlighting, a feature that was required. The highlighting is from a field returned by Postgres FTS, where it returns the text around the search term for context and bolds the search terms. Spelling Mistakes # Unfortunately, tsearch does not handle misspelled words. However, as I mentioned before, PgSearch allows for other search features! And trigram is a feature that can be installed via a Postgres extension (pg_trgm) that does just that. Trigram # The idea behind trigram search is to split pieces of text into sets of three-letter segments, and compare the sets to one another If two trigram sets are similar enough, we assume there was a spelling mistake, and return the document with the correctly-spelled term. As a quick example (ignoring whitespace): Consider the word Viget. Viget would make trigrams: [vig, ige, get] Now, consider our evil twin agency, Qiget. They would make trigrams [qig, ige, get] The two trigram sets match very closely, with only one of the trigrams not being the same. Thus, if we were to compare these with pg_trgm, we could reasonably tell that anyone typing 'Qiget' must have been actually looking for 'Viget', and just misspelled it. Working Trigram into our existing solution # PgSearch allows us to use multiple search features at once, so we can use tsearch and trigram side by side. Note that we cannot just replace tsearch with trigram due to needing some features in tsearch that are exclusive to it. Here is what an example configuration might look like. PgSearch.multisearch_options = { using: { tsearch: { prefix: true, highlight: { MaxFragments: 1 } }, trigram: { only: [:content] } } } Trigram (and timelines) causing issues # While it was easy to slot Trigram into our multisearch, it caused a pretty serious performance hit. We were seeing 50x-75x slower searches with both features combined than with just tsearch. We needed to find a way to balance performance with handling misspellings At the point that handling misspellings became prioritized, the entire search feature was almost fully QA'd and about ready to go out. There wasn't much time left in the budget to find a good solution for the issue. This thread from the PgSearch repo sums it up pretty well – there were multiple other users that were/are having similar issues as we were. The top-rated comment in this thread is someone mentioning that the solution was to just use ElasticSearch ('top-rated' is doing a lot of heavy lifting. It did have the most likes...at two). We needed to find some sort of middle ground solution that we could act on quickly. Postgres Documentation saves the day # In the docs for the Trigram Postgres extension, the writers give an idea for using Trigram in conjunction with Full Text Search. The general idea is to create a separate words table that has a Trigram index on it. Something like this worked for us. Note that we added an additional step with a temporary table. This was to allow us to filter out words that included non-alphabet characters. execute <<-SQL -- Need to make a temp table so we can remove non-alphabet characters like websites CREATE TEMP TABLE temp_words AS SELECT word FROM ts_stat('SELECT to_tsvector(''simple'', content) FROM pg_search_documents'); CREATE TABLE pg_search_words ( id SERIAL PRIMARY KEY, word text ); INSERT INTO pg_search_words (word) SELECT word FROM temp_words WHERE word ~ '^[a-zA-Z]+$'; CREATE INDEX pg_words_idx ON pg_search_words USING GIN (word gin_trgm_ops); DROP TABLE temp_words; SQL This words table is therefore populated with every unique word that exists in your search content table. For us, this table was pretty large. result = ActiveRecord::Base.connection.execute("SELECT COUNT(*) FROM pg_search_words").first['count'] puts result.first['count'] # => 1118644 Keeping the words table up-to-date # As mentioned in the docs, this table is separate from your search table. Therefore, it needs to be either periodically regenerated or at least have any new words added to search content also added to this table. One way to achieve this is with a trigger, which adds all new words (still filtering out non-alphabet characters) that are inserted into the documents table to the words table create_trigger("pg_search_documents_after_insert_update_row_tr", generated: true, compatibility: 1) .on("pg_search_documents") .after(:insert, :update) do <<-SQL_ACTIONS CREATE TEMP TABLE temp_words AS SELECT word FROM ts_stat('SELECT to_tsvector(''simple'', ' || quote_literal(NEW.content) || ')'); INSERT INTO pg_search_words (word) SELECT word FROM temp_words WHERE word ~ '^[a-zA-Z]+$'; DROP TABLE temp_words; SQL_ACTIONS end Note that this does not handle records being deleted from the table – that would need to be something separate. How we used the words table # Assuming for simplicity the user's search term is a single word, if the search returns no results, we compare the search term's trigram set to the trigram index on the words table, and return the closest match. Then, we'd show the closest match in a "Did you mean {correctly-spelled word}?" that hyperlinks to a search of the correctly-spelled word Given more time, I would have liked to explore options to speed up the combined FTS and Trigram search. I'm certain we could have improved on the performance issues, but I can't say for sure that we could have gotten the search time down to a reasonable amount. A future enhancement that would be pretty simple is to automatically search for that correctly-spelled word, removing the prompt to click the link. We could also change the text to something like "Showing results for {correctly-spelled word}". Ultimately, I think with the situation at hand, we made the right call implementing Trigram this way. The search is just as fast as before, and now in the case of misspellings, a user just has to follow the link to the correctly-spelled word and they will see the results they wanted very quickly. Full Article Code
w How we use DDEV, Vite and Tailwind with Craft CMS By www.viget.com Published On :: Wed, 10 Jul 2024 11:00:00 -0400 In 2022 we changed our dev tooling for new Craft CMS projects. Goodbye complex esoteric Webpack configuration, hello Vite. Goodbye complex esoteric Docker Compose configuration, hello DDEV. This small change in tooling has completely transformed our development experience. We start work faster and avoid wasting billable time debugging Webpack and Docker. From Webpack to Vite # Webpack has been the defacto way of bundling JavaScript and front end assets. It’s a powerful tool… but with that great power comes great responsibility complexity. Vite bills itself as the “next generation” of frontend tooling. Vite is much faster at bundling. But more importantly… its default configurations work great for most website projects. Before (Webpack) # Well over 300 lines of configuration spanning three files. Good luck making changes! After (Vite) # A crisp 30 - 50 lines of code. Want to switch to TypeScript? Need to drop in a popular front-end framework? Easy! All it takes is adding a plugin and 2-3 lines of config. Deleting old code has never felt this good! From Docker to DDEV # Docker is another development staple. It isolates server infrastructure into virtual “containers.” This helps avoid issues that arise from each developer having a slightly different setup. However, Docker can have a learning curve. Config changes, PHP upgrades and unexpected issues often eat up precious project time. Enter DDEV! DDEV describes itself as “Container superpowers with zero required Docker skills: environments in minutes, multiple concurrent projects, and less time to deployment.” We’ve found that statement to be 100% true. Before (Docker) # Every Craft project has a different Docker config. Bugs and upgrades required deep Docker experience. Last (but not least), it was difficult to run several projects at one time (ports often conflict). After (DDEV) # Performance is consistently better than our hand-rolled setup thanks to Mutagen and faster DB import/exports. Simultaneous projects run out of the box. DDEV provides (and maintains) a growing list of helpful shortcuts and DX features. Getting started # Ready to make the switch? Here’s how to set up DDEV, Vite and Tailwind on your own Craft project. Show me the config files already! # If you would rather see full config files instead of following step by step, check out our Craft Site Starter on GitHub. DDEV # Let’s set up a fresh DDEV project and start customizing. Make sure you have DDEV installed on your computer. If you’re a PHPStorm user, install the exceedingly helpful DDEV plugin. VS Code users have a similar plugin too! Follow Craft’s guide for creating a new project (they love DDEV too). Now you have a fresh .ddev/config.yaml just waiting to be customized. Node Version # Open your DDEV config and make sure your Node JS version matches Vite’s recommendations. nodejs_version: '20' # Vite 5 expects Node 18+ Ports for Vite’s dev server # Next, expose ports that Vite’s dev server uses will use to serve assets. web_extra_exposed_ports: - name: vite container_port: 3000 http_port: 3000 https_port: 3001 Routing ports can sometimes be confusing. This diagram might help! Vite’s dev server runs inside of DDEV’s web container (a Docker container). Until we expose these extra ports, any custom port within DDEV is unavailable to your host machine (your computer). When it’s time to configure Vite, we’ll use port 3000 HTTP and HTTPS traffic must use separate ports. We use port 3000 for http traffic and 3001 for https Run Vite automatically # Usually, you’ll want Vite to watch and build files automatically after you start a DDEV project. Using web_extra_daemons adds a separate background process (daemon) for Vite. web_extra_daemons: # Run Vite in a separate process - name: 'vite' command: 'npm install && npm run dev' directory: /var/www/html Use hooks to improve DX # DDEV’s powerful hooks system can run tasks before or after various DDEV commands. These post-start tasks keep dependencies and schemas up to date every time you start DDEV. hooks: post-start: - composer: install # Keeps installed packages up to date - exec: ./craft up # Apply migrations & project config changes Time for Vite # Vite is a Node app that’s installed with NPM. Your project will need a package.json. If you don’t have one set up yet, follow NPMs initialization script. ddev npm init # Don't forget to ignore node_modules! echo node_modules >> .gitignore ????Why ddev at the start of the command? This let’s us run NPM from within DDEV’s Docker containers. This means you’ll always be using the Node version configured for this project. DDEV has a bunch of shortcuts and aliases for running CLI commands (such as npm, yarn, craft and composer). Make sure your NPM package is configured for ES Modules # Our various config files will be using ES Module syntax for imports and exports. ddev npm pkg set type=module Install Vite! # ddev npm install --save-dev vite Add convenience scripts to package.json # "scripts": { "dev": "vite", "build": "vite build" } npm run dev runs Vite in dev mode. It watches and builds your files every save. Files are served through Vite’s dev server. npm run build bundles your JavaScript, CSS and static images for production. Your deploy process will usually call this script. Configure vite.config.js # Running Vite for a server rendered CMS requires some extra configuration. These options put production files in the right spot and keeps Vite’s dev server running on a specific port. import { defineConfig, loadEnv } from 'vite' // Match ports in .ddev/config.yaml and config/vite.php const HTTP_PORT = 3000 const HTTPS_PORT = 3001 export default defineConfig(({ command, mode }) => { const env = loadEnv(mode, process.cwd(), '') return { // In dev mode, we serve assets at the root of https://my.ddev.site:3000 // In production, files live in the /dist directory base: command === 'serve' ? '' : '/dist/', build: { manifest: true, // Where your production files end up outDir: './web/dist/', rollupOptions: { input: { // The entry point for Vite, we'll create this file soon app: 'src/js/app.js', }, }, }, server: { // Special address that respond to all network requests host: '0.0.0.0', // Use a strict port because we have to hard code this in vite.php strictPort: true, // This is the port running "inside" the Web container // It's the same as continer_port in .ddev/config.yaml port: HTTP_PORT, // Setting a specific origin ensures that your fonts & images load // correctly. Assumes you're accessing the front-end over https origin: env.PRIMARY_SITE_URL + ':' + HTTPS_PORT, }, } }) Add JavaScript and CSS files (Entrypoint) # Vite needs an entry point to determine what JavaScript, CSS and Front End assets it needs to compile. Remember src/js/app.js that we defined in vite.config.js? Let's make that file now. /* Make a file in src/js/app.js */ import '../css/app.css' console.log('Hello Craft CMS') We’ll also add our CSS as an import in app.js . In plain-old-JavaScript you can’t import CSS files. However, Vite uses this to figure out CSS dependencies for the project. Once Vite builds everything for production, you end up with a separate CSS file. The Craft Vite plugin includes this automatically with along your JavaScript bundle. /* Make a file in src/css/app.css */ body { background-color: peachpuff; } Install the Vite Craft Plugin # ddev composer require nystudio107/craft-vite ddev craft plugin/install vite Vite assets have different URLs in dev mode vs. production. In dev mode, assets are served from Vite’s dev server. It uses the ports that we defined in our DDEV & Vite configs. When Vite builds for production, filenames are hashed (app.js becomes app-BZi_KJSq.js). These hashes change when the contents of the file changes. Browser can cache these files indefinitely. When an asset changes, a whole new file is served. To help find these hashed filenames, Vite creates a manifest.json file. The manifest associates the name of your asset src/js/app.js to the hashed file that ends up on your server web/dist/assets/app-BZi_KJSq.js The Craft Vite Plugin by NYStudio107 takes care of all this routing for you. { "src/js/app.js": { "file": "assets/app-BZi_KJSq.js", "name": "app", "src": "src/js/app.js", "isEntry": true, "css": ["assets/app-BXePGY5I.css"] } } Configure the Vite Craft Plugin # Make a new plugin config file in config/vite.php <?php use crafthelpersApp; // Use the current host for dev server requests. Otherwise fall back to the primary site. $host = Craft::$app->getRequest()->getIsConsoleRequest() ? App::env('PRIMARY_SITE_URL') : Craft::$app->getRequest()->getHostInfo(); return [ 'devServerPublic' => "$host:3001", // Matches https_port in .ddev/config.yaml 'serverPublic' => '/dist/', 'useDevServer' => App::env('CRAFT_ENVIRONMENT') === 'dev', 'manifestPath' => '@webroot/dist/.vite/manifest.json', // Optional if using React or Preact // 'includeReactRefreshShim' => true, ]; Include your Vite bundles in Twig # The script and asset functions includes the appropriate files depending on in if you’re in dev mode or production. Clear out your templates/index.twig file and add the following snippet to your <head> tag. {# Load our main CSS file in dev mode to avoid FOUC #} {% if craft.vite.devServerRunning() %} <link rel="stylesheet" href="{{ craft.vite.asset("src/css/app.css") }}"> {% endif %} {{ craft.vite.script('src/js/app.js', false) }} Whew! ???? We’re at a point now where we can test our integration. Run ddev restart and then ddev launch . You should see “Hello Craft CMS” in your browser console. Setup Tailwind # Now that Vite is processing src/css/app.css, it’s time to install Tailwind and really get cooking. These steps are based on Tailwind’s official installation guide. But make sure to run all commands from within DDEV. Install packages # ddev npm install -D tailwindcss postcss cssnano autoprefixer # No DDEV shortcut for npx :( ddev exec npx tailwindcss init -p Configure template paths in tailwind.config.js # /** @type {import('tailwindcss').Config} */ export default { // Watch Twig templates and any JS or JSX that might use Tailwind classes. content: ['./templates/**/*.twig', './src/**/*.{js,jsx,ts,tsx,svg}'], theme: { extend: {}, }, plugins: [], } Configure postcss.config.js for production # export default { plugins: { tailwindcss: {}, autoprefixer: {}, ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}) } } Add Tailwind directives to src/css/app.css # @tailwind base; @tailwind components; @tailwind utilities; You’ll most likely need to run ddev restart again to get Vite to recognize your new Tailwind config. ❓ Do i need to set up live reload of Twig? Turns out it’s already done for you! Styling a Tailwind project means editing Twig files to change styles. It’s super handy to reload your browser every time you save. Normally you’d reach for vite-plugin-restart to get this functionality. However, Tailwind’s JIT mode automatically notifies Vite when CSS has compiled and the page should reload. That's a wrap! # That’s all it takes to configure a minimal DDEV and Vite project! We’ve found that both of these tools are easy to extend as a project get more complo'ex. Adding things like Redis or React are just a plugin install and a few lines of config away. ???? If you'd like to see this setup (and more) in a real-world Craft CMS project, check out our Craft Site Starter on GitHub. Go forth and Vite + DDEV to your heart’s desire. Full Article Code Content Management Tooling
w What is a Headless CMS and When Should I Use One? By www.viget.com Published On :: Wed, 17 Jul 2024 10:00:00 -0400 When starting a new project, decision makers are faced with the dilemma of choosing a content management system (CMS). Sometimes, it’s not that simple and they must choose whether to go with a traditional CMS or a headless CMS. Both offer unique benefits and cater to different needs, making it crucial to understand when each makes sense for your project. Let’s take a look at some considerations that can help you make the right decision.What is a Traditional CMS?Traditional CMS’s – like Craft CMS, WordPress, and Drupal – offer a pre-packaged solution for content creation, management, and delivery. They include powerful interfaces with content editing capabilities and templating out of the box, enabling you to create sites with ease. A traditional CMS can be monolithic because the back-end and front-end are tightly coupled. Using a traditional CMS typically means you are using all of the tools included to achieve your goal.What is a Headless CMS?A Headless CMS is like a Traditional CMS in that it includes content creation and management tools. But it differs in the fact that the back-end content management system is decoupled from the front-end (presentation layer), allowing developers to use any technology stack they prefer for building the front-end of the site. The back-end acts as an API with its only purpose being to serve content from the database. There are CMS options like Contentful, Payload, and Strapi that are built to be headless. Popular traditional CMS’s like Craft CMS and WordPress also offer headless variants.The Restaurant AnalogyLet’s simplify things a bit more and look at the decision using an analogy; a restaurant. Traditional Restaurant (Traditional CMS)Imagine a restaurant where the kitchen and dining room are connected. The chefs cook the food, and the waitstaff serve it directly to the customers in the same building. This setup means that everything is closely integrated, and the kitchen (back-end) is tightly coupled to the dining experience (front-end). Picture a scenario where the restaurant decides to change from table service to buffet style. The food now needs to be prepared in advance and delivered to the front of house in a different way, potentially even requiring new equipment. The restaurant needs to be reconfigured to not only accommodate the buffet but also to interface with the kitchen differently. Because the restaurant and kitchen are coupled, both sides would require work in order to accommodate a shift in strategy. Ghost Kitchen (Headless CMS)Now, think of a ghost (or cloud) kitchen where food is prepared centrally but can be delivered to various locations or dining experiences. The kitchen (back-end) focuses solely on cooking (content creation and management) and doesn't worry about where the food is served. Instead, the meals (content) can be delivered to different endpoints like food trucks, home deliveries, or partner restaurants (or in our case websites, mobile apps, etc.). This separation allows more flexibility in how and where the content is delivered without changing the core cooking process. If a new experience requires new equipment or processes, the kitchen can be expanded without affecting the front-end experience.When to Use a Headless CMSOmni-Channel Content Delivery If you consistently need to deliver content across multiple platforms (websites, mobile apps, IoT devices), a headless CMS is ideal because it can serve the same content through APIs to any front-end. The front-end can be swapped out without any need for development to the back-end.Scalability and FlexibilityIf you want the ability to keep your content management system up-to-date independently of the presentation layer, a headless CMS can allow for more agile and scalable development. This could be especially useful if you anticipate needing to redesign or update parts of the front-end frequently without affecting the back-end content.Front-end Framework PreferencesMaybe your team has developers who are very proficient in a particular JavaScript framework, like Next.js, SvelteKit, or Astro. The time needed to learn a new templating language could push you past your deadline. Maybe you have some cool interactive interface in mind? A headless CMS can provide the raw content for your developers to build highly custom, tailor-made front-ends in whatever language or framework they please.SecurityGoing headless can offer security advantages due to its decoupled nature. By communicating via API to the front-end, data access can be controlled more granularly. Because the back-end is only responsible for content management and delivery, fewer plugins are typically used which means a smaller chance of vulnerabilities due to third-party software.Hosting & InfrastructureA cloud-based headless CMS offers additional advantages over a self-hosted headless CMS. It can simplify maintenance and operating costs since the cloud provider is responsible for updates and security of the platform. Cloud-based solutions like Strapi Cloud often come with integrated security features, automatic backups, and disaster recovery options.Which will you choose?While the flexibility and security a headless CMS offers may be great benefits, it may not be necessary for every project and could even introduce complexity. It’s important to consider the long-term purpose of the project and who will be responsible for maintaining it as well as authoring content. If your primary focus is on managing and delivering content in a structured manner with rapid development, a traditional CMS can be an excellent choice. But if you feel any of the examples I’ve laid out above align with your project’s requirements then a headless CMS may be right for you! Whatever route you take, remember that both Craft CMS and WordPress can be used in traditional or headless applications and are a fine choice either way! Now you know the differences between a traditional and headless CMS, and an informed decision can be made. If you have more questions or a project you think could benefit from a traditional or headless CMS, we’d love to help! Full Article Code Front-end Engineering Back-end Engineering Content Management
w Building Well-Connected Distributed Teams By www.viget.com Published On :: Tue, 06 Aug 2024 09:30:00 -0400 Five years ago, without consciously trying, I would have noticed if a coworker was taking a break, feeling extra chatty, or looking hyper-focused. I got to choose whether to respond and how I might build rapport by responding (I’m sure I didn’t always get it right). Now that more of the Viget team works from home than in an office, I feel a loss. I have less awareness of other people's states of mind and fewer chances to demonstrate my interest. I need to learn new ways of connecting. I took notice when Adam Grant recently posted about pebbling: Sending memes, links, and videos to others isn't trivial. It signals that you're thinking of them and want them to share your joy. It's known as pebbling, based on penguins gifting pebbles to potential partners. Pebbling is an act of care. Every pebble is a bid for connection.” Grant acknowledges that the term "pebbling" comes from penguins, but he also uses the phrase “bid for connection,” which I associate with John Gottman. Gottman is a well-known psychologist who has researched marital stability and relationships. His work provides insights into how small interactions, or "bids," play a crucial role in building strong relationships. Gottman defines a "bid" as any attempt from one person to another for attention, affirmation, affection, or any positive connection. A bid can be as explicit as saying, “I had such a hard day,” or as random as saying, “Did you see the size of that red bird?” The impact of responding with interest (turning toward) or ignoring or dismissing (turning away from) significantly influences the quality of the relationship. A simple, “Tell me what happened,” or “What? No, I missed it!” can foster closeness and trust. Silence or something like, “Here we go again,” will spark feelings of neglect and distance.Gottman's research is widely cited and has impacted my understanding of relationships. I'm interested in bids for connection at work, particularly as our work environment has changed dramatically in recent years.Connections at WorkFinding the right balance of work and non-work is a central challenge for most of us as we navigate demands on our time and energy. I generally hope work is a small enough part of a person’s life that they have time for many other things, but also that their work environment is engaging and meaningful enough that they enjoy it. I hope friendships emerge at work, mostly through collaboration or out of the gaps between responsibilities. As remote work has become commonplace, I find it’s harder to foster connections than it was before. The lack of proximity, and therefore organic social interactions, makes it harder for me to know my coworkers and be known by them. I’m not advocating for returning to offices. I’m noticing that after working with people for years in an office, I knew them better – their nerves before a presentation, their ability to set new people at ease, their grandma’s soup recipe, their knack for deadpan humor – and that made my life better. While many of my coworkers collaborate with each other daily through pair programming, design critiques, or iteration planning meetings, my work on a small People Team has always been less collaborative. For me, fewer organic in-person interactions means fewer interactions of any kind at work. The decline in ad-hoc opportunities for connecting impacts us all differently, but I am particularly interested because an aspect of my role at Viget is to nurture a strong company culture. For us that means a culture where we do excellent work, learn a lot, support each other, and – yes – make some friends. I’m looking for ways we can adapt our employee engagement efforts to the new work environment and evolve how we cultivate alignment.The concept of "bids for connection" seems useful for understanding the building blocks of connection and, over time, friendships. As a mostly remote company, I want to be sure we’re asking: How do people make bids? How do others respond to them? What parts of the work environment encourage us to turn towards a bid? Bids While DistributedThere needs to be “space” for these interactions to happen across a distributed company, and we need to notice what is working and why. One opportunity for bids to play out is in recurring meetings. At Viget, we try to be efficient with our time, but we also build in time for informal interactions. Daily Stand-up MeetingsThe discipline and project teams that do daily stand-ups are careful to keep them brief. These meetings need to be reliably quick-paced in order to fulfill their purpose. Still, without sacrificing efficiency, these meetings can spark strong bids for connection. Sharing work updates in small, daily increments encourages people to open up about specific elements of their progress. The specificity allows for connection in ways that broad strokes do not. Hearing someone say, “Progress was slow, but I’m finally done with the feature,” I might respond, “Oh, good.” But hearing someone say, “If I don’t figure out how to debug this API integration by noon, we need to update the launch timeline," gives me a chance to be curious, helpful, and invested in something very specific. Weekly All-Hands MeetingEvery Friday, our whole company meets for about an hour. The first 15 minutes are deliberately set aside for informal conversations and sharing, which mostly happens over Slack. We often play music or show a live stream of something noteworthy, like an eagle’s nest, to which we can react. Someone might share where they were when they first heard this song. Someone else might reveal they are an experienced falconer. The whole company gets a chance to see or hear these things, and while only a handful may react, we are all building shared awareness and memories.Monthly Team MeetingDuring a team meeting, a small group of same-discipline-peers comes together to talk shop, share lessons learned, or bond. These meetings allow for exercises that don’t scale to a whole company – like getting feedback or planning progress – and over time, certain activities can become team favorites. A monthly “rose, bud, thorn” or an annual “sharing circle” ritual prompts people to share in ways that otherwise might feel too awkward or vulnerable. Another way to make and respond to bids for connection across locations is on Slack. Different kinds of Slack channels offer different kinds of opportunities.Interest-based Slack ChannelsAt Viget we have channels like #woodworking, #sewing, #starwars, #hot-sauce, #gardening, #home-improvement, and many, many more. These types of channels allow people to go deeper than they might in more general channels. You know you’re talking to like-minded people, so why not dive fully into your opinion on robot vacuum cleaners?"Random" Slack ChannelIn our #random channel, I’ve seen everything from a heads up on free Firehouse subs to a recommendation for an estate planning system. The responses vary, too – sometimes they spark day-long conversations. At a minimum, posts will get a smattering of emoji responses and the impact can be significant. For example, a post might get a sympathetic :heart: but then a couple :same: or :it-me: come in and before you know it, there’s a subset of coworkers who realize they share the same rare phobia. I also think a share in #random can signal, “I’m between tasks. I’m open to distractions right now,” and folks can follow up with a DM.Project-Specific Slack ChannelIn channels where everyone is working on the same project with shared goals, stresses, and deadlines, we might see bids that build momentum. A PM might post something in the morning to encourage the team to rally behind a tough deadline. A designer might post mid-week, acknowledging the drudgery of certain tasks, implicitly giving everyone else permission to do the same. A developer might be slowly building a little arsenal of inside jokes and call-backs over weeks, dropping a note at just the right time to get others laughing. Someone might turn one of those jokes into a custom emoji that lives well beyond the project timeline and every time that inside-joke-emoji gets used, it's a bid for folks who worked on that team to recognize each other and reconnect. Recognizing BidsWe all grew up learning in-person social norms and have a mostly shared understanding of what’s considered warm, polite, stand-off-ish, or rude in the workplace. Now that we’re distributed, we may need to learn to recognize new signals and define new norms. A bid is an action that invites connection, but sometimes the action is so small, we might not notice it or realize it has potential value. Understanding the concept of bids can help us notice them and respond with more awareness. If we train ourselves to see bids for what they are and respond accordingly, we may get more mileage out of the limited impromptu interactions we have as remote coworkers. Actions like responding to an open-ended question in a Slack channel or acknowledging someone’s request for help during a meeting go a long way. Each response builds trust and camaraderie, even if in tiny doses. When a comment or question is ignored or dismissed, the negative effect is compounding; that person is less likely to reach out again.Adam Grant said sharing memes and links are a way to invite someone to share in your joy. At a distributed company, “bids” take a lot of different shapes, but they all communicate things like, “I am here,” and “let’s work together,” and “you can trust me.”I’m encouraged to think we already have some infrastructure in place at Viget to support remote bids for connection. I’m excited to work with Aubrey Lear and others to find ways to evolve that infrastructure. We’ll continue to hire people who want to develop friendships with coworkers and who are willing to take personal responsibility for making and turning towards bids. Together, we can make sure Viget remains a great place to work as the workplace continues to evolve. Full Article News & Culture Employee Engagement
w 10 Things I Learned in My 10 Weeks at Viget By www.viget.com Published On :: Wed, 07 Aug 2024 09:56:00 -0400 This summer, I was the Application Developer Intern at Viget. This being my first internship, I was pleasantly surprised by how much I learned. Rather than being tasked with fetching coffee or doing busy work, the internship focused primarily on our growth and development as interns. As my time at Viget comes to a close, I wanted to reflect on ten key things I learned during my experience here.Following the real-world development cycleGoing into this internship, my development process involved me sitting down and coding until the feature was completed, and that's it. During this internship, I learned and practiced the development cycle used at Viget. For each feature, I created a Branch. Then, I submitted a Pull Request once it was completed. After that, my advisor reviewed my code and gave feedback. Once I had completed the requested changes (if any), I would rebase and merge into the main branch. This cycle made the code cleaner, and the feedback on my code always ensured I was going in the right direction.Maintaining a clean git historyDuring my development process at Viget, my advisor ensured I took the necessary steps to maintain a clean git history in my projects. I put the corresponding issue number next to each git commit and pull request. This made it much easier to see which commits belonged to which feature when reviewing git history. I also learned to always use “rebase and merge” rather than “create a merge commit” when merging a pull request. This helped when reviewing git history as merge commits make it much more difficult to understand what’s going on, and rebase and merge provided a clean git history.Getting introduced to DevOpsNevin Morgan hosted a MicroClass where he went over the basics of DevOps. Going in, I didn’t know much about DevOps, but the class gave me a solid understanding of the basics. DevOps is a combination of philosophies, practices, and tools designed to improve the speed of development. Their responsibilities include:Keeping Communication clear for development teamsMaking sure teams continue collaboratingEnsuring deployments are quick and reliableI also got the chance to pair with Nevin when he set up AWS deployment for one of my projects, and when he was setting up Grafana for Viget. Getting to see DevOps in action gave me a good idea of what goes into being part of the DevOps team.Learning to work with clientsAt the start of our intern group project, Nathan Long gave us a presentation on what it's like to work with clients. He covered the typical client project cycle, client presentations, and how to handle client feedback. For our project, we simulated a client relationship with Viget as our client. They provided us with their requirements, and me and the other interns planned out the details of what we would deliver. Throughout the process, we gave several client presentations, received valuable feedback, and iterated on our product. Two weeks later, we had a finished product, which we presented to the client in a live demo. This whole process was designed to mimic what Viget goes through with real clients, and seeing the different perspective required when working with clients was really eye-opening for me.Exploring digital accessibilityNathan Schmidt hosted a MicroClass for the interns on Accessibility. He gave us an overview of what digital accessibility is and who it impacts. I learned that digital accessibility is the lens through which we ensure that people of all abilities, and particularly those with disabilities, are able to engage with the digital world. Every website is graded to a level set from the Web Content Accessibility Guidelines (WCAG). These guidelines include video captions, text size, color contrast, and many more requirements. It is the industry standard to follow these WCAG guidelines so that your website can be accessible to a broad range of consumers.Building confidence in public speakingWhen the summer began and I learned that I would need to present to the entire company, I felt intimidated. Public speaking has always been a source of anxiety for me, but I had numerous opportunities to work on this skill. Throughout the summer, I became increasingly confident. First, my fellow interns and I presented our group project to everyone at Viget at the company-wide all hands meeting known as TTT. I presented my personal project to the Dev team, discussing the libraries I used and walking through my code. The most significant presentation I delivered was my final one, where I spoke to everyone at Viget about my Gap Year through a Viget Tradition known as LabShares. Public speaking is a skill that improves with practice, and the various opportunities I had greatly boosted my confidence in this area.Diving into Vanilla JavaScriptGoing into this summer, I had never written a line of JavaScript in my life. I quickly learned that JavaScript is essential if you’re going to work in web development. On my personal project, which was an audio sharing social media app, I had a for you page, and I wanted to make the page update as soon as the user went to the next sound. This would require me to write JavaScript. I went through and wrote Vanilla JavaScript to update all the necessary information from the server's response. Although it was a challenging and tedious process, it significantly enhanced my understanding of how websites work and the role of JavaScript in web development.Getting my feet wet with RailsFor the first half of the internship, I got my foothold in Ruby on Rails. This was my first time writing in Ruby, so there was a bit of a learning curve. I started with the Rails tutorial and then made a Hacker News clone. This exposed me to a broad range of the application stack and got me prepared for the Intern project, where I also used Rails. I found Rails’ Model, View, Controller setup to be very intuitive, so the learning process was relatively painless.Discovering the benefits of TailwindBeing the only Application Developer Intern, my focus throughout the internship was primarily on the back-end. However, I did have the chance to use Tailwind for the first time during my personal project. The biggest thing that stuck out to me was how it was convenient to not have to go through and change the stylesheets myself. With Tailwind's utility-first approach, you can quickly apply predefined classes for spacing, colors, typography, and more, without having to write custom CSS. This makes it much faster to prototype and iterate on designs, as you can see changes immediately by simply adjusting the class names in your HTML.Exploring the Basics of ReactChris Manning hosted a MicroClass on React. I had never actually used React, but he made the class very beginner friendly. React is a JavaScript library, whose main strength is how dynamically it responds to user input and cascades UI changes. Chris went over JSX and React components, props, children, and state memory. I didn’t have time to actually write any React this summer, but I appreciate that Chris hosted this class after I said React was something I was interested in!Reflecting on what I’ve learned here at Viget, I realize how invaluable this experience has been for both my personal and professional growth. From learning Rails and JavaScript, to understanding the intricacies of client relationships, I've gained a wealth of knowledge that extends far beyond technical skills. The opportunity to work alongside experienced professionals and receive constructive feedback has been a huge source of development for me. As I move forward, I am excited to apply these lessons and continue exploring the world of Software Development, confident in the foundation this internship has provided. Full Article Code News & Culture Back-end Engineering Internships and Apprenticeships
w Craft 5: What It Means For Super Table Page Builders By www.viget.com Published On :: Wed, 14 Aug 2024 10:00:00 -0400 If you’re like us, you’ve likely built ‘page builder’ fields in Craft CMS using Matrix. But sometimes you need more than a block. We use Super Table to create ‘page sections’ that include some extra settings (like background color, controls for width, etc.). We can then nest a Matrix field to control page blocks within the Page Section (Super Table). This has worked well for us in the past but there's a new, simpler way to achieve this starting in Craft 5.Upgrading a site from Craft 4 to Craft 5 can seem intimidating. Even more so when your site relies on complex content models like the one I described above. You might think, okay I'll upgrade to Craft 5 and then look into migrating to the newer method in the future. Well, now is the time. Verbb has announced that Super Table has reached end-of-life. While there is a Craft 5 compatible version available, it won't receive updates. That means now is the perfect time to migrate your Super Table fields to native Matrix fields.Craft 5 makes the process easy by converting Matrix blocks to entry types automatically during the upgrade. This guide will walk you through the process. We'll cover preparation, the upgrades themselves, and steps to clean up afterward. As you’ll see below, the process is actually quite simple and nothing to stress over! An example page builder using Super Table with a nested Matrix in Craft 4 Preparing for the UpgradeThe first step in any upgrade is preparation. Start by backing up your site’s database. This ensures that you can restore your site to its previous state if anything goes wrong during the upgrade process. We use (and love) DDEV here at Viget, so this guide will be leveraging it. But you can easily adapt the commands if you are not. To create a database backup, run: ❯ ddev snapshot Next, review the compatibility of your installed plugins. Check the Plugin Store or the author’s site to confirm that each plugin has a Craft 5 compatible version. Make a list of any plugins that need updating or replacing. Super Table will need to be updated to at least version 4.0.0. It's also essential to familiarize yourself with the Craft 5 Upgrade Guide. This guide provides detailed information on the changes, new features, and potential breaking changes in Craft 5, helping you understand what to expect. It serves as a fantastic set of instructions to get your site upgraded.The Upgrade ProcessOnce you're prepared, you can begin the upgrade process. Per the Craft Upgrade Guide, we will update Craft and plugins at the same time. Open your editor and modify your composer.json with the new versions of your plugins. The two for sure we will need to modify are: "craftcms/cms": "^5.0.0", "verbb/super-table": "^4.0.0", After you've checked all your versions and are ready to proceed, run: ❯ ddev composer update This command will update Craft (and its dependencies) and all your plugins to the latest version compatible with Craft 5. After updating, you need to run the database migrations to complete the upgrade. This can be accomplished by running: ❯ ddev craft up During this upgrade process, Craft 5 automatically converts all of your existing Matrix blocks to entry types. This conversion requires no interaction from you, streamlining one of the most complex aspects of the upgrade. After it’s finished, all of your non-reusable matrix blocks are now their own reusable entry type. Craft 5 automatically converted the matrix blocks to their own entry types Updating Super Table Fields and TemplatesWith the Matrix blocks converted to entry types, you need to reconfigure any Super Table fields to be Matrix fields.Update Super Table Fields:Browse to Settings > Fields and edit any Super Table fieldsChange the field type from Super Table to Matrix (there will be no content loss when switching from Super Table to Matrix)Select the entry type to use (Craft has already created one for you)Save the fieldThat's it! Changing the field type from Super Table to Matrix (with no content loss) Review Your Templates: # If you've been working with Super Table content as part of entry queried data, you may not need to make template changes at all Search your templates for craft.superTable to find any direct queries of Super Table blocks and replace them with entry queries At this point, you have removed your dependency on Super Table and have a page builder entirely built with Matrix fields. What were previously Super Table blocks are now a custom Entry Type and what were Matrix blocks are now also Entry Types. This allows you to have nested Matrix within Matrix thanks to Craft’s Entrification plan. A nested Matrix in Matrix page builder at last! Our page builder looks just like before, only now it adds entries instead of blocks Cleaning Up After the UpgradeAfter updating your fields and templates, it's time to clean up. First, uninstall the Super Table plugin. Navigate to Settings > Plugins in the Control Panel to uninstall the plugin. Then remove it from your project by running: ❯ ddev composer remove verbb/super-table Thoroughly test your site to ensure everything is functioning correctly. Pay close attention to the entry types where you used Super Table fields, confirming that authoring and your front-end work as expected.Additionally, you can also take this opportunity to clean up your fields and entry types. Craft 5’s reusable fields and entry types give you ample opportunity to consolidate and Craft 5 provides new utilities to make this process as simple as possible.fields/auto-merge — Automatically discovers functionally identical fields and merges their uses together.fields/merge — Manually merge one field into another of the same type and update uses of the merged field.entry-types/merge — Merge one entry type into another and update uses of the merged entry type.That’s it!Upgrading from Craft 4 to Craft 5 and transitioning from Super Table is incredibly simple, thanks to Craft 5’s automatic conversion of Matrix blocks to entry types. Super Table will no longer be maintained moving forward, and it's better to switch to the native Craft solution for better long-term support. By following these steps, you can quickly tackle the change and take advantage of the new features and improvements in Craft 5. With careful planning, thorough testing, and a few commands, you’ll have your page builder working again in Craft 5 in no time. Happy upgrading! Full Article Code Back-end Engineering Content Management Performance
w Founders Welcoming Business Partners By www.viget.com Published On :: Mon, 21 Oct 2024 15:54:00 -0400 When Viget was founded in 1999, Andy and I used the title “Founding Partner.” We were founders of the business and also committed business partners. Within a couple of years, we switched to more specific titles: Co-Founder and President (Andy) and Co-Founder and CEO (me), but “business partners” was always the key structure.We divided responsibilities of leadership, delivery, and operations in ways that optimized our different strengths and weaknesses. Key decision making has always been a collaborative process, with healthy debate between the two of us. I know some incredible solo entrepreneurs, but for us, having a partner to lean on, leverage, and grow with has been not only rewarding, it’s been essential to Viget’s longevity and success.Also key to our success has been a founding principle of hiring incredible people who share our values and vision, value longevity and lasting relationships, and take pride in their work and careers. As they’ve joined, we’ve shared the opportunities and responsibilities that come with running a healthy business. Empowering others to lead key parts of Viget has taken us further than we’d ever gone otherwise.Being owners and partners in the business has always been a privilege, an honor, and, at times, a stressful burden. When things go well – clients are happy, the team is gelling, the finances are solid – I’m filled with pride, satisfaction, and calm. When things aren’t going well – projects are sideways, turnover seems contagious, and the metrics point in the wrong direction – I’m filled with anxiety, frustration, and self-doubt. In either scenario, having a partner to navigate the waters with has been vital.In recent years, three key areas of our business have matured thanks to the overall strength of our team and especially strong leadership. Our sales and marketing systems, tools, and strategies have fed a much more predictable revenue engine with great clients. Our client delivery processes and best practices have helped us consistently deliver value for our clients with more clarity, less risk, and better results. Finally, through some very challenging years in our industry, our culture has grown stronger and more adaptable, still centered on meaningful human connections at the core.These three business areas have been led by Zach Robbins (sales and marketing), Kelly Kenny (delivery), and Emily Bloom (culture). They are the pillars upon which all other aspects of the business are built. These leaders have truly grown up with the business, having joined more than 13, 14, and 17 years ago, respectively. Their impact first as individual contributors, then managers, and eventually strategic leaders has been immeasurable.Viget is coming up on a major milestone: we’ll soon eclipse 25 years since our founding on December 27, 1999. As Andy and I looked out at the next decade and beyond of our business, expanding our partnership became a clear goal. Embracing additional partners to not just lead their area of the business but to weigh in on all major decisions would help Viget continue to mature into the business we believe it can be. We saw an opportunity to invite others into the deep water of business partnership – the good, bad, and ugly – so that our shared decision making can be sharper, more insightful, and more strategic in the years to come. At our fall retreat last week, we announced that we're welcoming Emily, Zach, and Kelly as partners at Viget. They’ve each been here for more than half of Viget’s history, each shaping Viget into what it is today. As partners, they’ll have even more influence as we take Viget into our second quarter century and beyond. Full Article News & Culture
w 5 Ways to Make Your Next In-Person All-Hands Event Worthwhile By www.viget.com Published On :: Fri, 25 Oct 2024 13:41:00 -0400 In recent years, as distributed work has become the norm, all-hands trips have become more commonplace. Even companies that have always done them now see their importance in a new light. They are expensive and demanding for everyone involved, but when they’re done well they can be incredibly impactful. Are you bringing your team together and feeling the stress of getting it right? Designing the time together takes strategic thinking, logistics planning, and the confidence to ask everyone to contribute to the event’s success.Last week, we came together to connect, celebrate each other, and look forward to a bright future in our quarterly all-hands event we call Third Third Thursday or TTT. It was our first in-person all-hands event since May 2023. At Viget, we actively build our culture together. The responsibility doesn’t fall on just a few individuals' shoulders. Our events are successful because individuals show up, speak up, listen, and honor the limited time we have together in-person. This is evident in the chats over breakfast pastries, the all-in approach to competitions breakout sessions, and the peer talks and discussions throughout our events. This connection and camaraderie doesn’t just happen, we work hard to make it happen. Reflecting on last week’s event (and 7 years of other events), I want to share these five key planning tips to help you craft a successful event. Leverage your physical space to help achieve your event goals. This fall we had a smaller number of attendees and we wanted to encourage discussion throughout the event so we set up the room in large U shape to foster conversation. We also made the most of our exterior space, which featured a fire escape staircase, by hosting an egg drop competition. Over communicate, especially around when team members can expect breaks and when they can expect to be fed. As the event lead, I share my phone number multiple times ahead of and throughout the event. We also make sure to communicate in dedicated channels, including an event Slack channel for all attendees, a behind-the-scenes Slack channel for presenters only, and an event website. We share important key information like bus schedules and flight confirmations via email. In advance of the big day, we shared this slide with our team to both inform and inspire. Leave room for unstructured time and connection. Over the years we learned that some of the best discussions and a-ha moments come from chats over a meal or a snack during the “unplanned” parts of the event. Now we plan ahead for these, leaving ample time for unplanned, impromptu a-has. We think about airport Uber rides, charter bus rides, morning runs, evening board games, or late-night drinks and look for ways to grease the wheels of serendipity. This was especially important for us this fall since it had been so long since the last time we all gathered together. Look for ways to celebrate what is unique to your company. One pretty fantastic thing that comes with a quarter century in business is the community we’ve built along the way. We make a point to keep up with previous Viget employees who we proudly call our alumni. We love our alumni and enjoy recognizing their contributions to Viget. One way we do so is with annual picnics, which we host when the most current Viget employees are in town for an event. These picnics are often a great mix of reconnections and networking. Find ways to surprise and delight. Think big and small. For example, this fall we put colored pencils and butcher block paper out during our meeting time. Our autumnal decor included blue(ish) and orange pumpkins (Viget colors!). We made a subtle callout to an internal project by serving french fries as our afternoon snack. And we surprised our team with Unreal treats for their bus rides home. The treats served as dessert and a means for us to introduce our next in-person event, our spring TTT, aka Viget25. Some companies advocate for all-hand retreats to be social and relaxing, but not “productive.” They tout a meeting-free event. At Viget, we see the meeting time as crucial because that is when peers share knowledge, reflect on their recent work, showcase client impact, and highlight new ideas and personal growth. Similarly, our co-founders reflect on Viget’s performance and share thoughts on the upcoming business direction. The meeting sparks genuine inspiration and creates a time for us to remember what brought us to Viget in the first place – to build world class tech in support of our clients. On the heels of a successful gathering, it’s time to start planning the next one. For our next event we’ll head to the Allegheny Mountains where we’ll leverage a unique and memorable venue, offer plenty of unstructured time for connection (with each other and nature), loop in alumni where appropriate, plan inspiring meeting content, enjoy many meals and treats together, and of course find ways to surprise and delight. Work-related travel isn't for everyone, but if you know someone who appreciates the idea of dedicated time to connect with and celebrate their peers, we’re hiring. And to all the culture champions and event planners out there, good luck with your next all-hands! Full Article News & Culture Employee Engagement
w Why the Cheapest Hourly Rate Often isn’t the Cheapest Option By www.viget.com Published On :: Wed, 30 Oct 2024 10:30:00 -0400 When choosing an outsourcing partner for design and development, many decision-makers naturally start by comparing hourly rates. At first glance, it seems logical: a lower hourly rate means lower project costs, right?The truth is, hourly rates can be a misleading metric. The actual cost of outsourcing is much more complex than the dollar amount tied to hourly rates. In this article, we’ll explore why focusing on hourly rates can obscure the true cost of a project and why it’s crucial to dig deeper when evaluating potential partners. I’ll end by suggesting a few things to focus on instead of or in addition to the hourly rate.Efficiency vs. Hourly RatesImagine you have two outsourcing options for a specific task:Pat: A developer who charges $100/hour and takes 3 hours to complete the task. Terry: A developer who charges $200/hour but only takes 2 hours to complete the same task.Pat’s hourly rate is lower and Pat’s total cost looks cheaper. The total cost for Pat is $300, while for Terry, it's $400. But there's more at play than the hourly breakdown.Terry may be faster because they are more skilled, experienced, or familiar with the problem. They produce a higher-quality output that might need little to no revision, while Pat may deliver work requiring additional oversight, rework, or fine-tuning.This brings us to a crucial point: efficiency and expertise often outweigh raw hourly cost.Hidden Costs of Oversight and ManagementThe cost of managing lower-cost teams can quickly add up. Inexperienced or less skilled developers often require more:Guidance and supervision: You or your in-house team may have to spend significant time managing or directing work, which adds hidden costs to the project.Rework and revisions: Less-experienced teams may not get it right the first time, and even small mistakes can snowball into major issues that need to be fixed later on.Communication barriers: Some outsourcing teams might not be as effective in communicating progress or roadblocks, which can slow down the entire project and lead to missed deadlines.Each of these factors chips away at the apparent "savings" from choosing a lower hourly rate.Quality: The Long-Term InvestmentDesign and development work (insourced or outsourced) is an investment, not just a cost. High-quality work may come with a higher hourly rate, but the long-term savings are substantial:Fewer bugs and technical debt: A more experienced development team will likely deliver better code, resulting in fewer bugs and long-term maintenance issues. A more experienced designer is more likely to think through and design for all edge cases, filling in all the gaps.Faster delivery: A skilled team is often more familiar with best practices, frameworks, and tools that allow them to complete tasks efficiently.Scalability: High-quality designers and developers think ahead and design systems that can scale with your needs, preventing costly future refactoring.The Cost of "Cheap" WorkSometimes, "cheap" work ends up being the most expensive in the long run. Lower-quality outsourcing might require you to:Hire another team to fix or rebuild the work.Delay product launches due to unanticipated project overruns.Damage customer trust by releasing subpar products riddled with bugs or poor design.In some cases, teams that seem "affordable" may not have the expertise to foresee potential pitfalls, which means costly issues arise later in the process.Calculating the Total Cost of OwnershipTo truly compare outsourcing options, decision-makers should consider the total cost of ownership (TCO), not just the hourly rate. TCO includes:Efficiency: How quickly and effectively can the team complete the work?Oversight: How much management and guidance will the team require?Quality: Will the output meet your expectations, or will it need significant revisions or rework?Maintenance: What will it cost to maintain or scale the system after the initial work is done?A team with a higher hourly rate but lower total costs in these areas may be the more cost-effective choice in the long run. For a more complete example:Pat: Your $100/hr developer completes a task in 3 hours ($300), requires 1 hour of oversight from an in-house Senior Developer ($150), and eventually needs to be refactored or rebuilt entirely ($1,000).Terry: Your $200/hr developer completed a task in 2 hours ($400) based on a 10-minute overview from an in-house Senior Developer ($15), and makes an above-and-beyond measurable impact on page performance (priceless).The best long-term investment becomes more clear when you consider all the variables. Conclusion: Think Beyond Hourly RatesWhen investing in design or development, your goal should be to maximize ROI, not minimize hourly rates. When comparing outsourcing options, focus on the bigger picture—their efficiency, quality, and the hidden costs of oversight and management. Consider how your prospective partners measure up in terms of:Results: can they point to clear results of their work in which they played some critical role?References: would previous clients choose to hire them again (indicating they are worth their cost)?Communication: do they respond quickly and with clarity?Expertise: do they provide opinions and advice or are they simply order takers?Relevance: is their prior experience directly relevant to your needs? If not, do they have a track record for navigating novelty well?The right team might not always be the cheapest on paper, but they’ll deliver the greatest long-term value. Outsourcing isn’t about getting work done cheaply—it’s about getting it done right, and more often than not, the old mantra “you get what you pay for” holds. Full Article Strategy
w What Is Silica Gel? How Does It Work? By www.beyondphototips.com Published On :: Mon, 16 Sep 2024 21:29:32 +0000 This post: What Is Silica Gel? How Does It Work? was first published on Beyond Photo Tips by Susheel Chandradhas Ever fished out those little packets from a new camera bag and thought, “What on earth is Silica Gel?” Well, buckle up, because we’re about to dive into the wonderful world of these moisture-munching marvels! You might think they’re just pesky packaging, but let me tell you, Silica Gel is about to become your camera […] This post: What Is Silica Gel? How Does It Work? was first published on Beyond Photo Tips Full Article Maintenance Guides humidity Silica Gel storage