What’s Old is New

Featured Imgs 23

I collect a bunch of links in a bookmarks folder. These are things I fully intend to read, and I do — eventually. It’s a good thing bookmarks are digital, otherwise, I’d need a bigger coffee table to separate them from the ever-growing pile of magazines.

The benefit of accumulating links is that the virtual pile starts revealing recurring themes. Two seemingly unrelated posts published a couple months apart may congeal and become more of a dialogue around a common topic.

I spent time pouring through a pile of links I’d accumulated over the past few weeks and noticed a couple of trending topics. No, that’s not me you’re smelling — there’s an aroma of nostalgia in the air., namely a newfound focus on learning web fundamentals and some love for manual deployments.

Web Developers, AI, and Development Fundamentals

Alvaro Montero:

Ultimately, it is not about AI replacing developers, but about developers adapting and evolving with the tools. The ability to learn, understand, and apply the fundamentals is essential because tools will only take you so far without the proper foundation.

ShopTalk 629: The Great Divide, Global Design + Web Components, and Job Titles

Chris and Dave sound off on The Great Divide in this episode and the rising value of shifting back towards fundamentals:

Dave: But I think what is maybe missing from that is there was a very big feeling of disenfranchisement from people who are good and awesome at CSS and JavaScript and HTML. But then were being… The market was shifting hard to these all-in JavaScript frameworks. And a lot of people were like, “I don’t… This is not what I signed up for.”

[…]

Dave: Yeah. I’m sure you can be like, “Eat shit. That’s how it is, kid.” But that’s also devaluing somebody’s skillset. And I think what the market is proving now is if you know JavaScript or know HTML, CSS, and regular JavaScript (non-framework JavaScript), you are once again more valuable because you understand how a line of CSS can replace 10,000 lines of JavaScript – or whatever it is.

Chris: Yeah. Maybe it’s coming back just a smidge–

Dave: A smidge.

Chris: –that kind of respecting the fundamental stuff because there’s been churn since then, since five years ago. Now it’s like these exclusively React developers we hired, how useful are they anymore? Were they a little too limited and fundamental people are knowing more? I don’t know. It’s hard to say that the job industry is back when it doesn’t quite feel that way to me.

Dave: Yeah, yeah. Yeah, who knows. I just think the value in knowing CSS and HTML, good HTML, are up more than they maybe were five years ago.

Just a Spec: HTML Finally Gets the Respect It Deserves

Jared and Ayush riffin’ on the first ever State of HTML survey, why we need it, and whether “State of…” surveys are representative of people who work with HTML.

[…] once you’ve learned about divs and H’s 1 through 6, what else is there to know? Quite a lot, as it turns out. Once again, we drafted Lea Verou to put her in-depth knowledge of the web platform to work and help us craft a survey that ended up reaching far beyond pure HTML to cover accessibility, web components, and much more.

[…]

You know, it’s perfectly fine to be an expert at HTML and CSS and know very little JavaScript. So, yeah, I think it’s important to note that as we talk about the survey, because the survey is a snapshot of just the people who know about the survey and answer the questions, right? It’s not necessarily representative of the broad swath of people around the world who have used HTML at all.

[…]

So yeah, a lot of interest in HTML. I’m talking about HTML. And yeah, in the conclusion, Lea Verou talks about we really do have this big need for more extensibility of HTML.

In a more recent episode:

I’m not surprised. I mean, when someone who’s only ever used React can see what HTML does, I think it’s usually a huge revelation to them.

[…]

It just blows their minds. And it’s kind of like you just don’t know what you’re missing out on up to a point. And there is a better world out there that a lot of folks just don’t know about.

[…]

I remember a while back seeing a post come through on social media somewhere, somebody’s saying, oh, I just tried working with HTML forms, just standard HTML forms the first time and getting it to submit stuff. And wait, it’s that easy?

Yeah, last year when I was mentoring a junior developer with the Railsworld conference website, she had come through Bootcamp and only ever done React, and I was showing her what a web component does, and she’s like, oh, man, this is so cool. Yeah, it’s the web platform.

Reckoning: Part 4 — The Way Out

Alex Russell in the last installment of an epic four-part series well worth your time to fully grasp the timeline, impact, and costs of modern JavsaScript frameworks to today’s development practices:

Never, ever hire for JavaScript framework skills. Instead, interview and hire only for fundamentals like web standards, accessibility, modern CSS, semantic HTML, and Web Components. This is doubly important if your system uses a framework.

Semi-Annual Reminder to Learn and Hire for Web Standards

Adrian Roselli:

This is a common cycle. Web developers tire of a particular technology — often considered the HTML killer when released — and come out of it calling for a focus on the native web platform. Then they decide to reinvent it yet again, but poorly.

There are many reasons companies won’t make deep HTML / CSS / ARIA / SVG knowledge core requirements. The simplest is the commoditization of the skills, partly because framework and library developers have looked down on the basics.

The anchor element

Heydon Pickering in a series dedicated to HTML elements, starting alphabetically with the good ol’ anchor <a>:

Sometimes, the <a> is referred to as a hyperlink, or simply a link. But it is not one of these and people who say it is one are technically wrong (the worst kind of wrong).

[…]

Web developers and content editors, the world over, make the mistake of not making text that describes a link actually go inside that link. This is collosally unfortunate, given it’s the main thing to get right when writing hypertext.

AI Myth: It lets me write code I can’t on my own

Chris Ferndandi:

At the risk of being old and out-of-touch: if you don’t know how to write some code, you probably shouldn’t use code that Chat GPT et al write for you.

[…]

It’s not bulletproof, but StackOverflow provides opportunities to learn and understand the code in a way that AI-generated code does not.

What Skills Should You Focus on as Junior Web Developer in 2024?

Frontend Masters:

Let’s not be old-man-shakes-fist-at-kids.gif about this, but learning the fundamentals of tech is demonstrateably useful. It’s true in basketball, it’s true for the piano, and it’s true in making websites. If you’re aiming at a long career in websites, the fundamentals are what powers it.

[…]

The point of the fundamentals is how long-lasting and transferrable the knowledge is. It will serve you well no matter what other technologies a job might have you using, or when the abstractions over them change, as they are want to do.

As long as we’re talking about learning the fundamentals…

The Basics

Oh yeah, and of course there’s this little online course I released this summer for learning HTML and CSS fundamentals that I describe like this:

The Basics is more for your clients who do not know how to update the website they paid you to make. Or the friend who’s learning but still keeps bugging you with questions about the things they’re reading. Or your mom, who still has no idea what it is you do for a living. It’s for those whom the entry points are vanishing. It’s for those who could simply sign up for a Squarespace account but want to understand the code it spits out so they have more control to make a site that uniquely reflects them.

Not all this nostalgia is reserved only for HTML and CSS, but for deploying code, too. A few recent posts riff on what it might look like to ship code with “buildless” or near “buildless” workflows.

Raw-Dogging Websites

Brad Frost:

It is extraordinarily liberating. Yes, there are some ergonomic inefficiencies, but at the end of the day it comes out in the wash. You might have to copy-and-paste some HTML, but in my experience I’d spend that much time or more debugging a broken build or dependency hell.

Going Buildless

Max Böck in a follow-up to Brad:

So, can we all ditch our build tools soon?

Probably not. I’d say for production-grade development, we’re not quite there yet. Performance tradeoffs are a big part of it, but there are lots of other small problems that you’d likely run into pretty soon once you hit a certain level of complexity.

For smaller sites or side projects though, I can imagine going the buildless route – just to see how far I can take it.

Manual ’till it hurts

Jeremy Keith in a follow-up to Max:

If you’re thinking that your next project couldn’t possibly be made without a build step, let me tell you about a phrase I first heard in the indie web community: “Manual ‘till it hurts”. It’s basically a two-step process:

  1. Start doing what you need to do by hand.
  2. When that becomes unworkable, introduce some kind of automation.

It’s remarkable how often you never reach step two.

I’m not saying premature optimisation is the root of all evil. I’m just saying it’s premature.


That’s it for this pile of links and good gosh my laptop feels lighter for it. Have you read other recent posts that tread similar ground? Share ’em in the comments.


What’s Old is New originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.



from CSS-Tricks https://ift.tt/c7EQXyz
Gain $200 in a week
via Read more

Pitch Deck Design: 10 Tips to Stand Out

Featured Imgs 23

A good pitch deck is designed for specifically one thing – to help your startup get funding from investors. But how do you stand out from the crowd, and make a memorable impression?

There’s a delicate balance to creating a deck with just enough slides to entice potential funders, without providing so much information that they are overwhelmed.

Most pitch decks contain less than 20 slides. So how do you create a pitch deck design that stands out? Here are our ten tips to help you get started.

1. Pick a Template or Palette

In most cases, a simple template is the best option.

Whether you are designing a pitch deck from scratch or starting with a template, you need to stick to a visual theme. Slides should have a consistent color and type palette as well as design elements, such as page number or a header/footer.

Streamline your deck to a handful of slide types that fit your content so that the design is consistent from the first to the final slide.

In most cases, a simple pitch deck template is the best option. Look for something with darker text on a light or white background. This color combination is easy to read on screens or in darker rooms when projected onto a wall. (It also makes for easy printing if you want to provide a handout copy to meeting participants.)

2. Use Your Branding

pitch deck design

Use your brand throughout so that it starts to stick with the people you are talking to.

By the time you are ready to talk with investors, you should have a simple brand established. This includes a logo or wordmark and basic color palette. It should also include a list of keywords that you use to talk about your business.

Use all of this in your pitch deck. As you create a slide design, make sure the template incorporates your colors and branding.

These visual elements can make a lasting impression. Make it count.

And don’t make this mistake. Too often, pitch decks “save” the branding as a surprise for the end of the presentation. Don’t. Use your brand throughout so that it starts to stick with the people you are talking to. Give them more opportunity to fall in love with your idea, brand, and company.

3. Include Charts to Simplify Content

Pitch decks are packed with heavy content, including plenty of numbers.

Use charts to simplify this content. Are you experiencing revenue growth? Chart it. A chart is an easy way to see and understand that information quickly. Plus, bar and pie charts are easy to create. (Just make sure to label everything clearly.)

Bonus tip: You can also use pie charts to highlight statistics, again making a text element more visual and understandable.

4. Use Stellar Images

pitch deck design

Don’t feel like you have to have an image on every slide if they get repetitive.

Put forth the effort to get some great images for your pitch deck. Not stock images. Actual photos of your team, product or service.

You know that people are more likely to engage with an image than text and that goes for memory as well. A good image will stand out in someone’s memory longer than a slide full of words.

The challenge is that not everyone has a visual product or service. That’s where you’ll have to be a little more creative, show the team in action or create a diagram or illustration.

Don’t feel like you have to have an image on every slide if they get repetitive. Get a few images that best represent what you are selling with the pitch deck and stick to those. Scatter them strategically throughout the pitch deck.

5. Organize with Icons

pitch deck design

Another visual element to consider is icons. These small illustrations can help organize complex ideas and provide visual flow throughout a single slide or the entire design.

Pick an icon set that matches your visual theme and use them to break up the copy, create a grouping, and keep the visual flow moving.

6. Try Tiled Layouts for Complex Information

pitch deck design

When it comes to presenting complex information, consider a modular tiled layout style. Titles can help you break down information into smaller, more digestible parts.

These bite-sized bits can eliminate the need for using multiple slides for a handful of facts or figures as well.

Design tiles with color blocks or use icons in each to establish different pieces of content visually.

7. Use Professional Headshots for Team Members

pitch deck design

If you plan to include images of your team in the pitch deck (many companies do), invest in professional headshots so that photos are consistent and represent your startup brand well.

This isn’t to say they have to be boring. Photos with personality are acceptable, but all team headshots should be in the same style with similar coloring and backgrounds.

Think about the type of investor you are trying to get money from, what type of photo would appeal to them? Consider that for the style of your team headshots or group photo.

8. Create a Type Hierarchy

pitch deck design

Just like with any other type of design, create a hierarchy for text elements.

  • Title
  • Header
  • Secondary header or subhead
  • Main body text
  • Bulleted text
  • Captions
  • Infographic text
  • Footer text

9. Design with Contrast in Mind

pitch deck design

Every element in your pitch deck should include plenty of contrast against the background and other elements. Avoid the temptation to use a template where everything has a similar color or contrast, while these might look great on a screen, they can present readability issues and don’t often render well when projected or printed.

It’s important to balance modern design with readability. It is vital that potential investors understand everything about your startup company when they view the pitch deck. Don’t let “overdesigned” slides get in the way.

10. Get Creative with Text-Heavy Slides

pitch deck design

There are some content types and information that will just seem heavy.

The history of your company or business trends, lists or SWOT analyses can get a little overwhelming on a slide. Use more visual formats with less focus on every actual work to communicate this information.

Try slides that use word cloud, timeline formats or XY graphs to present text-heavy or complex information in a more visual way. Even though these slides will still be somewhat thick, they’ll be easier to visually digest.

Conclusion

When creating your pitch deck, remember to keep your business goals in mind. Everything about the deck shows potential investors that you understand your company and business.

The design of your presentation communicates this as well. A professional, easy to understand deck is just one tool in the path of growing your startup.

How To Build Custom Data Visualizations Using Luzmo Flex

Featured Imgs 23

This article is a sponsored by Luzmo

In this article, I’ll introduce you to Luzmo Flex, a new feature from the Luzmo team who have been working hard making developer tooling to flatten the on-ramp for analytics reporting and data visualization.

With Luzmo Flex, you can hook up a dataset and create beautifully crafted, fully customizable interactive charts that meet your reporting needs. They easily integrate and interact with other components of your web app, allowing you to move away from a traditional “dashboard” interface and build more bespoke data products.

While many charting libraries offer similar features, I often found it challenging to get the data into the right shape that the library needed. In this article, I’ll show you how you can build beautiful data visualizations using the Google Analytics API, and you won’t have to spend any time “massaging” the data!

What Is Luzmo Flex?

Well, it’s two things, really. First of all, Luzmo is a low-code platform for embedded analytics. You can create datasets from just about anything, connect them to APIs like Google Analytics or your PostgreSQL database, or even upload static data in a .csv file and start creating data visualizations with drag and drop.

Secondly, Luzmo Flex is their new React component that can be configured to create custom data visualizations. Everything from the way you query your data to the way you display it can be achieved through code using the LuzmoVizItemComponent.

What makes Luzmo Flex unique is that you can reuse the core functionalities of Luzmo’s low-code embedded analytics platform in your custom-coded components.

That means, besides creating ready-to-use datasets, you can set up functions like the following out-of-the-box:

  • Multi-tenant analytics: Showing different data or visualizations to different users of your app.
  • Localization: Displaying charts in multiple languages, currencies, and timezones without much custom development.
  • Interactivity: Set up event listeners to create complex interactivity between Luzmo’s viz items and any non-Luzmo components in your app.

What Can You Build With Luzmo Flex?

By combining these off-the-shelf functions with flexibility through code, Luzmo Flex makes a great solution for building bespoke data products that go beyond the limits of a traditional dashboard interface. Below are a few examples of what that could look like.

Report Builder

A custom report builder that lets users search and filter a dataset and render it out using a number of different charts.

Filter Panel

Enable powerful filtering using HTML Select inputs, which will update each chart shown on the page.

Wearables Dashboard

Or how about a sleep tracker hooked up to your phone to track all those important snoozes?

When to Consider Luzmo Flex vs Chart Libraries

When building data-intensive applications, using something like Recharts, a well-known React charting library, you’ll likely need to reformat the data to fit the required shape. For instance, if I request the top 3 page views from the last seven days for my site, paulie.dev, I would have to use the Google Analytics API using the following query.

import dotenv from 'dotenv';
import { BetaAnalyticsDataClient } from '@google-analytics/data';
dotenv.config();

const credentials = JSON.parse(
  Buffer.from(process.env.GOOGLE_APPLICATION_CREDENTIALS_BASE64, 'base64').toString('utf-8')
);

const analyticsDataClient = new BetaAnalyticsDataClient({
  credentials,
});

const [{ rows }] = await analyticsDataClient.runReport({
  property: properties/${process.env.GA4&#95;PROPERTY&#95;ID},
  dateRanges: [
    {
      startDate: '7daysAgo',
      endDate: 'today',
    },
  ],
  dimensions: [
    {
      name: 'fullPageUrl',
    },
    {
      name: 'pageTitle',
    },
  ],
  metrics: [
    {
      name: 'totalUsers',
    },
  ],
  limit: 3,
  metricAggregations: ['MAXIMUM'],
});

The response would look something like this:

[
  {
    "dimensionValues": [
      {
        "value": "www.paulie.dev/",
        "oneValue": "value"
      },
      {
        "value": "Paul Scanlon | Home",
        "oneValue": "value"
      }
    ],
    "metricValues": [
      {
        "value": "61",
        "oneValue": "value"
      }
    ]
  },
  {
    "dimensionValues": [
      {
        "value": "www.paulie.dev/posts/2023/11/a-set-of-sign-in-with-google-buttons-made-with-tailwind/",
        "oneValue": "value"
      },
      {
        "value": "Paul Scanlon | A set of: \"Sign In With Google\" Buttons Made With Tailwind",
        "oneValue": "value"
      }
    ],
    "metricValues": [
      {
        "value": "41",
        "oneValue": "value"
      }
    ]
  },
  {
    "dimensionValues": [
      {
        "value": "www.paulie.dev/posts/2023/10/what-is-a-proxy-redirect/",
        "oneValue": "value"
      },
      {
        "value": "Paul Scanlon | What Is a Proxy Redirect?",
        "oneValue": "value"
      }
    ],
    "metricValues": [
      {
        "value": "23",
        "oneValue": "value"
      }
    ]
  }
]

To make that data work with Recharts, I’d need to reformat it so it conforms to the following data shape.

[
  {
    "name": "Paul Scanlon | Home",
    "value": 61
  },
  {
    "name": "Paul Scanlon | A set of: \"Sign In With Google\" Buttons Made With Tailwind",
    "value": 41
  },
  {
    "name": "Paul Scanlon | What Is a Proxy Redirect?",
    "value": 23
  }
]

To accomplish this, I’d need to use an Array.prototype.map() to iterate over each item, destructure the relevant data and return a key-value pair for the name and value for each.

const data = response.rows.map((row) => {
  const { dimensionValues, metricValues } = row;

  const pageTitle = dimensionValues[1].value;
  const totalUsers = parseInt(metricValues[0].value);

  return {
    name: pageTitle,
    value: totalUsers,
  };
});

And naturally, if you’re reformatting data this way in your application, you’d also want to write unit tests to ensure the data is always formatted correctly to avoid breaking your application… and all of this before you even get on to creating your charts!

With Luzmo Flex, all of this goes away, leaving you more time to focus on which data to display and how best to display it.

The First Steps to Building Bespoke Data Products

Typically, when building user interfaces that display data insights, your first job will be to figure out how to query the data source. This can take many forms, from RESTful API requests to direct database queries or sometimes reading from static files. Your next job will be figuring out when and how often these requests need to occur.

  • For data that rarely changes: Perhaps a query in the build step will work.
  • For data that changes regularly: A server-side request on page load.
  • For ever-changing data: A client-side request that polls an API on an interval.

Each will likely inform your application’s architecture, and there’s no single solution to this. Your last job, as mentioned, will be wrangling the responses, reformatting the data, and displaying it in the UI.

Below, I’ll show you how to do this using Luzmo Flex by using a simple example product.

What We’re Building: Custom Data Visualizations As Code

Here’s a screenshot of a simple data product I’ve built that displays three different charts for different reporting dimensions exposed by the Google Analytics API for page views for my site, paulie.dev, from the last seven days.

You can find all the code used in this article on the following link:

Getting Started With Luzmo

Before we get going, hop over to Luzmo and sign up for a free trial. You might also like to have a read of one of the getting started guides listed below. In this article, I’ll be using the Next.js starter.

Creating a Google Analytics Dataset

To create data visualization, you’ll first need data! To achieve this using Luzmo, head over to the dashboard, select Datasets from the navigation, and select GA4 Google Analytics. Follow the steps shown in the UI to connect Luzmo with your Google Analytics account.

With the setup complete, you can now select which reporting dimensions to add to your dataset. To follow along with this article, select Custom selection.

Lastly, select the following using the search input. Device Category, Page Title, Date, and Total users, then click Import when you’re ready.

You now have all the data required to build the Google Analytics dashboard. You can access the dataset ID from the URL address bar in your browser. You’ll need this in a later step.

If you’ve followed along from either of the first two getting started guides, you’ll have your API Key, API Token, App server, and API host environment variables set up and saved in a .env file.

Install Dependencies

If you’ve cloned one of the starter repositories, run the following to install the required dependencies.

npm install

Next, install the Luzmo React Embed dependency which exports the LuzmoVizItemComponent.

npm install  @luzmo/react-embed@latest

Now, find page.tsx located in the src/app directory, and add your dataset id as shown below.

Add the access object from the destructured response and pass access.datasets[0].id onto the LuzmoClientComponent component using a prop named datasetId.

// src/app/page.tsx


+ import dynamic from 'next/dynamic';

import Luzmo from '@luzmo/nodejs-sdk';
- import LuzmoClientComponent from './components/luzmo-client-component';
+ const LuzmoClientComponent = dynamic(() => import('./components/luzmo-client-component'), {
  ssr: false,
});


const client = new Luzmo({
  api_key: process.env.LUZMO_API_KEY!,
  api_token: process.env.LUZMO_API_TOKEN!,
  host: process.env.NEXT_PUBLIC_LUZMO_API_HOST!,
});

export default async function Home() {
  const response = await client.create('authorization', {
    type: 'embed',
    username: 'user id',
    name: 'first name last name',
    email: 'name@email.com',
    access: {
      datasets: [
        {
-          id: '<dataset_id>',
+          id: '42b43db3-24b2-45e7-98c5-3fcdef20b1a3',
          rights: 'use',
        },
      ],
    },
  });

-  const { id, token } = response;
+  const { id, token, access } = response;

-  return <LuzmoClientComponent authKey={id} authToken={token} />;
+  return <LuzmoClientComponent authKey={id} authToken={token} datasetId={access.datasets[0].id} />;
}

And lastly, find luzmo-client-component.tsx located in src/app/components. This is where you’ll be creating your charts.

Building a Donut Chart

The first chart you’ll create is a Donut chart that shows the various devices used by visitors to your site.

Add the following code to luzmo-client-component.tsx component.

// src/app/component/luzmo-client-component.tsx

'use client';

+ import { LuzmoVizItemComponent } from '@luzmo/react-embed';

interface Props {
  authKey: string;
  authToken: string;
+  datasetId: string;
}

- export default function LuzmoClientComponent({ authKey, authToken}: Props) {
+ export default function LuzmoClientComponent({ authKey, authToken, datasetId }: Props) {

+  const date = new Date(new Date().getTime() - 7 * 24 * 60 * 60 * 1000).toISOString(); // creates a date 7 days ago

  console.log({ authKey, authToken });

  return (
    <section>
+    <div className='w-1/2 h-80'>
+      <LuzmoVizItemComponent
+        appServer={process.env.NEXT_PUBLIC_LUZMO_APP_SERVER}
+        apiHost={process.env.NEXT_PUBLIC_LUZMO_API_HOST}
+        authKey={authKey}
+        authToken={authToken}
+        type='donut-chart'
+        options={{
+          title: {
+            en: Devices from last 7 days,
+          },
+          display: {
+            title: true,
+          },
+          mode: 'donut',
+          legend: {
+            position: 'bottom',
+          },
+        }}
+        slots={[
+          {
+            name: 'measure',
+            content: [
+              {
+                label: {
+                  en: 'Total users',
+                },
+                column: '<column id>', // Total users
+                set: datasetId,
+                type: 'numeric',
+                format: '.4f',
+              },
+            ],
+          },
+          {
+            name: 'category',
+            content: [
+              {
+                label: {
+                  en: 'Device category',
+                },
+                column: '<column id>', // Device category
+                set: datasetId,
+                type: 'hierarchy',
+              },
+            ],
+          },
+        ]}
+        filters={[
+          {
+            condition: 'or',
+            filters: [
+              {
+                expression: '? >= ?',
+                parameters: [
+                  {
+                    column_id: '<column id>', // Date
+                    dataset_id: datasetId,
+                  },
+                  date,
+                ],
+              },
+            ],
+          },
+        ]}
+      />
+    <div/>
    </section>
  );
}

There’s quite a lot going on in the above code snippet, and I will explain it all in due course, but first, I’ll need to cover a particularly tricky part of the configuration.

Column IDs

You’ll notice the filters parameters, measure, and category content all require a column id.

In the filters parameters, the key is named column_id, and in the measure and category, the key is named column. Both of these are actually the column IDs from the dataset. And here’s how you can find them.

Back in the Luzmo dashboard, click into your dataset and look for the “more dots” next to each column heading. From the menu, select Copy column id. Add each column ID to the keys in the configuration objects.

In my example, I’m using the Total users for the measure, the Device category for the category, and the Date for the filter.

If you’ve added the column IDs correctly, you should be able to see a rendered chart on your screen!

… and as promised, here’s a breakdown of the configuration.

Initial Props Donut chart

The first part is fairly straightforward. appServer and authKey are the environment variables you saved to your .env file, and authKey and authToken are destructured from the authorization request and passed into this component via props.

The type prop determines which type of chart to render. In my example, I’m using donut-chart, but you could choose from one of the many options available, area-chart, bar-chart, bubble-chart, box-plot, and many more. You can see all the available options in the Luzmo documentation under Chart docs.

<LuzmoVizItemComponent
  appServer={process.env.NEXT_PUBLIC_LUZMO_APP_SERVER}
  apiHost={process.env.NEXT_PUBLIC_LUZMO_API_HOST}
  authKey={authKey}
  authToken={authToken}
  type='donut-chart'

The one thing I should point out is my use of Tailwind classes: w-1/2 (width: 50%) and h-80 (height: 20rem). The LuzmoVizItemComponent ships with height 100%, so you’ll need to wrap the component with an element that has an actual height, or you won’t be able to see the chart on the page as it could be 100% of the height of an element with no height.

Donut Chart Options

The options object is where you can customize the appearance of your chart. It accepts many configuration options, among which:

  • A title for the chart that accepts a locale with corresponding text to display.
  • A display title value to determine if the title is shown or not.
  • A mode to determine if the chart is to be of type donut or pie chart.
  • A legend option to determine where the legend can be positioned.

All the available configuration options can be seen in the Donut chart documentation.

options={{
  title: {
    en: `Devices from last 7 days`,
  },
  display: {
    title: true,
  },
  mode: 'donut',
  legend: {
    position: 'bottom',
  },
}}

Donut Chart Slots

Slots are where you can configure which column from your dataset to use for the category and measure.

Slots can contain multiple measures, useful for displaying two columns of data per chart, but if more than two are used, one will become the measure.

Each measure contains a content array. The content array, among many other configurations, can include the following:

  • A label and locale,
  • The column id from the dataset,
  • The datasetId,
  • The type of data you’re displaying,
  • A format for the data.

The format used here is Python syntax for floating-point numbers; it’s similar to JavaScript’s .toFixed() method, e.g number.toFixed(4).

The hierarchy type is ​​the Luzmo standard data type. Any text column is considered as an hierarchical data type.

You can read more in the Donut chart documentation about available configuration options for slots.

slots={[
  {
    name: 'measure',
    content: [
      {
        label: {
          en: 'Total users',
        },
        column: '<column id>', // Total users
        set: datasetId,
        type: 'numeric',
        format: '.4f',
      },
    ],
  },
  {
    name: 'category',
    content: [
      {
        label: {
          en: 'Device category',
        },
        column: '<column id>', // Device category
        set: datasetId,
        type: 'hierarchy',
      },
    ],
  },
]}

Donut Chart Filters

The filters object is where you can apply conditions that will determine which data will be shown. In my example, I only want to show data from the last seven days. To accomplish this, I first create the date variable:

const date = new Date(new Date().getTime() - 7 * 24 * 60 * 60 * 1000).toISOString();

This would produce an ISO date string, e.g., 2024-08-21T14:25:40.088Z, which I can use with the filter. The filter uses Luzmo’s Filter Expressions, to determine if the date for each row of the data is greater than or equal to the date variable. You can read more about Filter Expressions in Luzmo’s Academy article.

filters={[
  {
    condition: 'or',
    filters: [
      {
        expression: '? >= ?',
        parameters: [
          {
            column_id: '<column id>', // Date
            dataset_id: datasetId,
          },
          date,
        ],
      },
    ],
  },
]}
Building a Line Chart

The second chart you’ll be creating is a Line chart that displays the number of page views on each date from the last seven days from folks who visit your site.

Initial Props Line Chart

As with the Donut chart, the initial props are pretty much the same, but the type has been changed to line-chart.

<LuzmoVizItemComponent
  appServer={process.env.NEXT_PUBLIC_LUZMO_APP_SERVER}
  apiHost={process.env.NEXT_PUBLIC_LUZMO_API_HOST}
  authKey={authKey}
  authToken={authToken}
  type='line-chart'

Line Chart Options

The options for the Line chart are as follows, and the mode has been changed to line-chart.

options={{
  title: {
    en: `Site visits from last 7 days`,
  },
  display: {
    title: true,
  },
  mode: 'grouped',
}}

Line Chart Slots

The slots object is almost the same as before with the Donut chart, but for the Line chart, I’m using the date column from the dataset instead of the device category, and instead of category, I’m using the x-axis slot type. To ensure I’m formatting the data correctly (by day), I’ve used level 5. You can read more about levels in the docs.

slots={[
  {
    name: 'measure',
    content: [
      {
        label: {
          en: 'Total users',
        },
        column: '<column id>', // Total users
        set: datasetId,
        type: 'numeric',
        format: '.4f',
      },
    ],
  },
  {
    name: 'x-axis',
    content: [
      {
        label: {
          en: 'Date',
        },
        column: '<column id>', // Date
        set: datasetId,
        type: 'datetime',
        level: 5,
      },
    ],
  },
]}

Line Chart Filters

I’ve used the same filters as I used in the Donut chart.

Building a Bar Chart

The last chart you’ll be creating is a Bar chart that displays the number of page views for the top ten most viewed pages on your site.

Initial Props Bar Chart

As with the Donut and Line chart, the initial props are pretty much the same, but the type has been changed to bar-chart.

<LuzmoVizItemComponent
  className='w-full h-80'
  appServer={process.env.NEXT_PUBLIC_LUZMO_APP_SERVER}
  apiHost={process.env.NEXT_PUBLIC_LUZMO_API_HOST}
  authKey={authKey}
  authToken={authToken}
  type='bar-chart'

Bar Chart Options

The options for the Bar chart are a little more involved. I’ve included some styling options for the border-radii of the bars, limited the number of results to 10, and sorted the data by the highest page view count first using the sort by measure and direction options.

options={{
  title: {
    en: `Page views from last 7 days`,
  },
  display: {
    title: true,
  },
  mode: 'grouped',
  bars: {
    roundedCorners: 5,
  },
  limit: {
    number: 10,
  },
  sort: {
    by: 'measure',
    direction: 'desc',
  },
}}

Line Chart Slots

As with the Line chart, I’ve used an axis for one of the columns from the dataset. In this case, it’s the y-axis which displays the page title.

slots={[
  {
    name: 'measure',
    content: [
      {
        label: {
          en: 'Total users',
        },
        column: '<column id>', // Total users
        set: datasetId,
        type: 'numeric',
        format: '.4f',
      },
    ],
  },
  {
    name: 'y-axis',
    content: [
      {
        label: {
          en: 'Page title',
        },
        column: '<column id>', // Page title
        set: datasetId,
        type: 'hierarchy',
      },
    ],
  },
]}

Bar Chart Filters

I’ve used the same filters as I used in the Donut and Line chart.

What’s Next

As you can see, there are plenty of types of charts and customization options. Because this is just an “ordinary” React component, you can very easily make it configurable by an end user by allowing options to be set and unset using HTML input elements, checkbox, select, date, and so on.

But for me, the real power behind this is not having to mutate data!

This is particularly pertinent when displaying multiple charts with different reporting dimensions. Typically, this would require each to have their own utility function or reformatting method. That said, setting column IDs and dataset IDs is a little fiddly, but once you have the component hooked up to the dataset, you can configure and reconfigure as much as you like, all without having to rewrite data formatting functions.

If you’re interested in bringing data to life in your application and want to get it done without the usual headaches, book a free demo with the Luzmo team to learn more!

How Much Should You Charge for Design Services?

Featured Imgs 23

It might be one of the most asked questions among freelance designers: what do you charge clients?

There can be so many variables in setting rates that you can stick to, and you have to make a choice between hourly and fixed options. Either way, a good pricing strategy can help you get the clients you want and earn a solid income from freelance work.

After you figure out pricing. Which is a challenge for almost anyone!

How Much Do Other Designers Charge?

The easiest way to figure out your rates is to see how much other designers are charging for their services.

indeed designer rates

Indeed, one of the largest online job boards, has a salary explorer tool that shows you the hourly rates and the salaries of professionals in each industry. The site allows you to browse the rates based on your country and even provides pricing data for different cities.

If you’re a freelancer, this is a great place to start your search for the ideal rate.

glassdoor designer rates

If you’re joining a company, agency, or seeking a full-time role, Glassdoor is the best place to learn about the salaries of other designers. Here you can explore the salaries submitted by fellow designers and even let you filter them based on your years of experience, industry, and more. Payscale is another website that provides similar information.

But don’t stop there. You can also ask directly from other designers. Use forums and sites like Reddit to ask other designers how much they are charging for different types of services. You’d be surprised how helpful the designer community can be.

It’s important to remember that these average rates are calculated based on the pricing data submitted by designers with various levels of experience and skills.

It will be difficult to find your exact number by looking at these websites. But, they will at least help you find a ballpark number to get started.

Set an Hourly Rate, for Starters

freelance prices

For most freelancers, setting an hourly rate is the place to start. It provides a baseline comparison to other freelancers in the market and is something clients can understand, as long as they are flexible with hours worked and pricing.

You can use time tracking software to keep up with exactly how much time you spend on projects – as long as you actually remember to use it and have solid focus while working on projects.

An hourly rate is great if you work at a moderate pace, take on projects that don’t shift a lot in time (clients don’t love getting revised pricing estimates) and like the flexibility of this time accounting method. On the other hand, some designers find that hourly rates hold them back because they can finish projects quickly and hours worked is not the only price consideration.

Be Competitive

If you decide to charge the same rates other designers are charging, it will be very difficult to land clients, unless you already have a good reputation.

In the beginning, it’s important to ask for a competitive rate that will position you above other designers. That doesn’t mean you need to charge cheaper and lower. You can still charge the same rates by providing more value.

For example, including additional tasks or services for free with your existing services is a great way to get the attention of the clients.

Consider Value-Based Pricing

If you’re an experienced designer with a variety of skill sets, years’ worth of knowledge, and success stories to back your claims, you should consider using a value-based pricing model.

This pricing strategy involves charging a rate based on the outcome of the project. For example, if you’re working on an advertising campaign for a high-profile client, you can charge them 10-20% of the sales they generate from the designs you make for them.

Most clients won’t be open to this type of pricing model and that will provide you with an even better opportunity to ask for a higher hourly rate or project price.

TheFutur YouTube channel has a great roleplay video that shows how this strategy plays out.

Know Your Costs

Your rate needs to reflect your costs plus take-home cash for yourself. Remember to include elements like taxes, rent and lights, software and other supplies when pricing projects. You need to be able to cover all costs before you’ll ever make any money as a freelancer.

The first thing you need to do is create a budget for your monthly and yearly expenses. This will help you find a yearly income goal. Simply put, it’s a way to figure out how much you need to earn.

Then figure out how many hours you are willing to work. This is an important factor that will help determine your hourly rate or even fixed rates for projects. If you’re willing to work longer hours, you’ll be able to charge competitive rates.

Again, income goals and work hours all depend on your skill set, experience, and location.

Price Hourly or by the Project

The alternative to hourly pricing is project pricing. Project pricing is preferred by a lot of designers who have been freelancing for a while.

This might be the best case for project pricing out there from Jake Jorgovan for Career Foundry:

When you charge based on the project, you are tying the price of the project to the client’s end result. The end result is all that the client cares about.

Shifting the focus of my freelancing away from the time I worked and toward the value I delivered changed everything. It completely changed my income potential and how much I made.

Setting project rates is a little trickier. Everyone does it a little differently. (Jorgovan even suggests making it up… kind of.)

Over the years, I have developed a little more of a strategy based on market and industry rates, creative flexibility with the project, client budget and potential long-term value, timeline and how I “feel about it” from the start.

  • Market and industry rates: What are others charging for similar services in your market? I tend to price well below agency pricing – I am a team of one and can’t provide the round the clock services of a full team – and in the middle of what other freelancers in my market charge based on how long I’ve been in the business.
  • Creative flexibility: The dirty secret is that I charge a little more for dud projects. No client will ever know who they are, but I do quote a little lower for a project that I really want to stretch my creative muscles. It helps me grow and expands my portfolio for later. The routine stuff gets more routine pricing.
  • Client budget and value: An accountant once said to me, charge every client what they are willing to pay. It took a while to really get this, but it all comes back to value. What is the project worth to them? The client is coming to you for your value and expertise. Price accordingly to show that your work is valuable. (A $5 logo never said “value” to anyone.)
  • Timetable: A project with a super-fast turn around is worth more to a client than something they need in 6 months. Think about scheduling to ensure that you can get it in and get it done on time. Think about whether you will have to price more to account for other projects getting bumped back.
  • The “feel:” Check your gut when you meet with a client for the first time. Do they know what they want? Or will they waffle? Clients that will require a lot of hand-holding along the way will take a lot more of your time for the same work. You should probably charge a little more here.

The biggest problem with project rates is that sometimes you’ll get it wrong. There are projects that will suck up your time and frustrate you to no end because you just estimated wrong. If this happens frequently, then you are an hourly rate kind of freelancer. If it only happens once in a while, project rates can be a great option.

Pro tip: Use a combination of project and hourly rates. Opt for hourly rates for small projects (or friends and family if you dare work with them) that will come in under $250. This includes simple logo design, a business card or poster for clients that you know and will almost always take the design as is with a few minor revisions. Use project rates for anything that requires a lot of setup or time, such as website redesigns, branding or large packets of information.

Include Contingencies

freelance prices

No matter what pricing structure you use, make sure to include a scope for each project and room for contingencies in the estimate.

Include some rules with client estimates to keep scope creep from eating away at potential earnings.

Include guidelines for:

  • What exactly the project entails, such as one website design with up to 10 pages.
  • Number of revisions included.
  • Rate for changes beyond the scope.
  • Payment guidelines; this is vital for big projects or large timelines where you might need to get some of the money up front.
  • Any additional fees, such as late charges, processing later or maintenance or upsells.

So What Should I Actually Charge?

bonsai-rate-calculator

As you can figure from all the information above, there’s no magic formula.

Price too low and you’ll worry about making enough money to pay the bills. (You can also run the risk of having too many clients because of underpricing.)

Price too high and you might have trouble getting projects.

You want to be somewhere in the middle, where you can take the clients you want and refer others elsewhere. And so much of it matters where you live and where the clients are based.

Contently has a solid database of freelance rates for writing, design and photography so you can see what people are actually getting paid. (Plus you can sort by category, rate or date.)

Bonsai also has a rates database that you can put in options such as design or development, skills, experience and location to get an idea of what hourly rates look like.

It can be tricky. The good news is that when you figure it out, you’ll know because your client mix will feel just right with a few large project, a few small projects and rewarding work.

Conclusion

OK, so maybe you did not get the exact answer you wanted. I could have told you to charge everyone $75 per hour for any project. But that would be a disservice to you.

It’s all about how you work and your client relationships. Feel them out. Understand their needs and work with clients to find just the right pricing strategy.

Freelancing 101 is an occasional series to help the increasing number of freelancers in the market. Whether you are a designer, writer, developer or wear multiple hats, we will share tips, resources and ideas to help you make the most of your small business. Is there something in particular you want to know? Let me know at carrie@designshack.net.

Creative commons photos by Death to the Stock Photo .

Tech Trends from Movies to Reality: How Sci-Fi Innovations are Becoming Real

Featured Imgs 23

Science fiction has long served as a playground for envisioning the future, presenting imaginative technologies and concepts that captivate our minds. What was once considered fantastical speculation in movies and novels is increasingly becoming a reality in today’s tech-driven world. From advanced robotics to artificial intelligence, many sci-fi innovations are making the leap from the …

The post Tech Trends from Movies to Reality: How Sci-Fi Innovations are Becoming Real first appeared on Lucid Softech.