Python GUIs: Getting Started With NiceGUI for Web UI Development in Python — Your First Steps With the NiceGUI Library for Web UI Development

https://www.pythonguis.com/static/tutorials/nicegui/getting-started-nicegui/first-nicegui-app.png

NiceGUI is a Python library that allows developers to create interactive web applications with minimal effort. It’s intuitive and easy to use. It provides a high-level interface to build modern web-based graphical user interfaces (GUIs) without requiring deep knowledge of web technologies like HTML, CSS, or JavaScript.

In this article, you’ll learn how to use NiceGUI to develop web apps with Python. You’ll begin with an introduction to NiceGUI and its capabilities. Then, you’ll learn how to create a simple NiceGUI app in Python and explore the basics of the framework’s components. Finally, you’ll use NiceGUI to handle events and customize your app’s appearance.

To get the most out of this tutorial, you should have a basic knowledge of Python. Familiarity with general GUI programming concepts, such as event handling, widgets, and layouts, will also be beneficial.

Installing NiceGUI

Before using any third-party library like NiceGUI, you must install it in your working environment. Installing NiceGUI is as quick as running the python -m pip install nicegui command in your terminal or command line. This command will install the library from the Python Package Index (PyPI).

It’s a good practice to use a Python virtual environment to manage dependencies for your project. To create and activate a virtual environment, open a command line or terminal window and run the following commands in your working directory:

  • Windows
  • macOS
  • Linux
sh

PS> python -m venv .\venv
PS> .\venv\Scripts\activate
sh

$ python -m venv venv/
$ source venv/bin/activate
sh

$ python3 -m venv venv/
$ source venv/bin/activate

The first command will create a folder called venv/ containing a Python virtual environment. The Python version in this environment will match the version you have installed on your system.

Once your virtual environment is active, install NiceGUI by running:

sh

(venv) $ python -m pip install nicegui

With this command, you’ve installed NiceGUI in your active Python virtual environment and are ready to start building applications.

Writing Your First NiceGUI App in Python

Let’s create our first app with NiceGUI and Python. We’ll display the traditional "Hello, World!" message in a web browser. To create a minimal NiceGUI app, follow these steps:

  1. Import the nicegui module.
  2. Create a GUI element.
  3. Run the application using the run() method.

Create a Python file named app.py and add the following code:

python

from nicegui import ui

ui.label('Hello, World!').classes('text-h1')

ui.run()

This code defines a web application whose UI consists of a label showing the Hello, World! message. To create the label, we use the ui.label element. The call to ui.run() starts the app.

Run the application by executing the following command in your terminal:

sh

(venv) $ python app.py

This will open your default browser, showing a page like the one below:

First NiceGUI Application
First NiceGUI Application

Congratulations! You’ve just written your first NiceGUI web app using Python. The next step is to explore some features of NiceGUI that will allow you to create fully functional web applications.

If the above command doesn’t open the app in your browser, then go ahead and navigate to http://localhost:8080.

Exploring NiceGUI Graphical Elements

NiceGUI elements are the building blocks that we’ll arrange to create pages. They represent UI components like buttons, labels, text inputs, and more. The elements are classified into the following categories:

In the following sections, you’ll code simple examples showcasing a sample of each category’s graphical elements.

Text Elements

NiceGUI also has a rich set of text elements that allow you to display text in several ways. This set includes some of the following elements:

The following demo app shows how to create some of these text elements:

python

from nicegui import ui

# Text elements
ui.label("Label")

ui.link("PythonGUIs", "https://pythonguis.com")

ui.chat_message("Hello, World!", name="PythonGUIs Chatbot")

ui.markdown(
    """
    # Markdown Heading 1
    **bold text**
    *italic text*
    `code`
    """
)

ui.restructured_text(
    """
    ==========================
    reStructuredText Heading 1
    ==========================
    **bold text**
    *italic text*
    ``code``
    """
)

ui.html("<strong>bold text using HTML tags</strong>")

ui.run(title="NiceGUI Text Elements")

In this example, we create a simple web interface showcasing various text elements. The page shows several text elements, including a basic label, a hyperlink, a chatbot message, and formatted text using the Markdown and reStructuredText markup languages. Finally, it shows some raw HTML.

Each text element allows us to present textual content on the page in a specific way or format, which gives us a lot of flexibility for designing modern web UIs.

Run it! Your browser will open with a page that looks like the following.

Text Elements Demo App in NiceGUI
Text Elements Demo App in NiceGUI

Control Elements

When it comes to control elements, NiceGUI offers a variety of them. As their name suggests, these elements allow us to control how our web UI behaves. Here are some of the most common control elements available in NiceGUI:

The demo app below showcases some of these control elements:

python

from nicegui import ui

# Control elements
ui.button("Button")

with ui.dropdown_button("Edit", icon="edit", auto_close=True):
    ui.item("Copy")
    ui.item("Paste")
    ui.item("Cut")

ui.toggle(["ON", "OFF"], value="ON")

ui.radio(["NiceGUI", "PyQt6", "PySide6"], value="NiceGUI").props("inline")

ui.checkbox("Enable Feature")

ui.slider(min=0, max=100, value=50, step=5)

ui.switch("Dark Mode")

ui.input("Your Name")

ui.number("Age", min=0, max=120, value=25, step=1)

ui.date(value="2025-04-11")

ui.run(title="NiceGUI Control Elements")

In this app, we include several control elements: a button, a dropdown menu with editing options (Copy, Paste, Cut), and a toggle switch between ON and OFF states. We also have a radio button group to choose between GUI frameworks (NiceGUI, PyQt6, PySide6), a checkbox labeled Enable Feature, and a slider to select a numeric value within a range.

Further down, we have a switch to toggle Dark Mode, a text input field for entering a name, a number input for providing age, and a date picker. Each of these controls has its own properties and methods that you can tweak to customize your web interfaces using Python and NiceGUI.

Note that the elements on this app don’t perform any action. Later in this tutorial, you’ll learn about events and actions. For now, we’re just showcasing some of the available graphical elements of NiceGUI.

Run it! You’ll get a page that will look something like the following.

Control Elements Demo App in NiceGUI
Text Elements Demo App in NiceGUI

Data Elements

If you’re in the data science field, then you’ll be thrilled with the variety of data elements that NiceGUI offers. You’ll find elements for some of the following tasks:

Here’s a quick NiceGUI app where we use a table and a plot to present temperature measurements against time:

python

from matplotlib import pyplot as plt
from nicegui import ui

# Data elements
time = [1, 2, 3, 4, 5, 6]
temperature = [30, 32, 34, 32, 33, 31]

columns = [
    {
        "name": "time",
        "label": "Time (min)",
        "field": "time",
        "sortable": True,
        "align": "right",
    },
    {
        "name": "temperature",
        "label": "Temperature (ºC)",
        "field": "temperature",
        "required": True,
        "align": "right",
    },
]
rows = [
    {"temperature": temperature, "time": time}
    for temperature, time in zip(temperature, time)
]
ui.table(columns=columns, rows=rows, row_key="name")

with ui.pyplot(figsize=(5, 4)):
    plt.plot(time, temperature, "-o", color="blue", label="Temperature")
    plt.title("Temperature vs Time")
    plt.xlabel("Time (min)")
    plt.ylabel("Temperature (ºC)")
    plt.ylim(25, 40)
    plt.legend()

ui.run(title="NiceGUI Data Elements")

In this example, we create a web interface that displays a table and a line plot. The data is stored in two lists: one for time (in minutes) and one for temperature (in degrees Celsius). These values are formatted into a table with columns for time and temperature. To render the table, we use the ui.table element.

Below the table, we create a Matplotlib plot of temperature versus time and embed it in the ui.pyplot element. The plot has a title, axis labels, and a legend.

Run it! You’ll get a page that looks something like the following.

Data Elements Demo App in NiceGUI
Data Elements Demo App in NiceGUI

Audiovisual Elements

NiceGUI also has some elements that allow us to display audiovisual content in our web UIs. The audiovisual content may include some of the following:

Below is a small demo app that shows how to add a local image to your NiceGUI-based web application:

python

from nicegui import ui

with ui.image("./otje.jpg"):
    ui.label("Otje the cat!").classes(
        "absolute-bottom text-subtitle2 text-center"
    )

ui.run(title="NiceGUI Audiovisual Elements")

In this example, we use the ui.image element to display a local image on your NiceGUI app. The image will show a subtitle at the bottom.

NiceGUI elements provide the classes() method, which allows you to apply Tailwind CSS classes to the target element. To learn more about using CSS for styling your NiceGUI apps, check the Styling & Appearance section in the official documentation.

Run it! You’ll get a page that looks something like the following.

Audiovisual Elements Demo App in NiceGUI

Audiovisual Elements Demo App in NiceGUI

Laying Out Pages in NiceGUI

Laying out a GUI so that every graphical component is in the right place is a fundamental step in any GUI project. NiceGUI offers several elements that allow us to arrange graphical elements to build a nice-looking UI for our web apps.

Here are some of the most common layout elements:

  • Cards wrap another element in a frame.
  • Column arranges elements vertically.
  • Row arranges elements horizontally.
  • Grid organizes elements in a grid of rows and columns.
  • List displays a list of elements.
  • Tabs organize elements in dedicated tabs.

You’ll find several other elements that allow you to tweak how your app’s UI looks. Below is a demo app that combines a few of these elements to create a minimal but well-organized user profile form:

python

from nicegui import ui

with ui.card().classes("w-full max-w-3xl mx-auto shadow-lg"):
    ui.label("Profile Page").classes("text-xl font-bold")

    with ui.row().classes("w-full"):
        with ui.card():
            ui.image("./profile.png")

            with ui.card_section():
                ui.label("Profile Image").classes("text-center font-bold")
                ui.button("Change Image", icon="photo_camera")

        with ui.card().classes("flex-grow"):
            with ui.column().classes("w-full"):
                name_input = ui.input(
                    placeholder="Your Name",
                ).classes("w-full")
                gender_select = ui.select(
                    ["Male", "Female", "Other"],
                ).classes("w-full")
                eye_color_input = ui.input(
                    placeholder="Eye Color",
                ).classes("w-full")
                height_input = ui.number(
                    min=0,
                    max=250,
                    value=170,
                    step=1,
                ).classes("w-full")
                weight_input = ui.number(
                    min=0,
                    max=500,
                    value=60,
                    step=0.1,
                ).classes("w-full")

            with ui.row().classes("justify-end gap-2 q-mt-lg"):
                ui.button("Reset", icon="refresh").props("outline")
                ui.button("Save", icon="save").props("color=primary")

ui.run(title="NiceGUI Layout Elements")

In this app, we create a clean, responsive profile information page using a layout based on the ui.card element. We center the profile form and cap it at a maximum width for better readability on larger screens.

We organize the elements into two main sections:

  1. A profile image card on the left and a form area on the right. The left section displays a profile picture using the ui.image element with a Change Image button underneath.

  2. A series of input fields for personal information, including the name in a ui.input element, the gender in a ui.select element, the eye color in a ui.input element, and the height and weight in ui.number elements. At the bottom of the form, we add two buttons: Reset and Save.

We use consistent CSS styling throughout the layout to guarantee proper spacing, shadows, and responsive controls. This ensures that the interface looks professional and works well across different screen sizes.

Run it! Here’s how the form looks on the browser.

A Demo Profile Page Layout in NiceGUI
A Demo Profile Page Layout in NiceGUI

Handling Events and Actions in NiceGUI

In NiceGUI, you can handle events like mouse clicks, keystrokes, and similar ones as you can in other GUI frameworks. Elements typically have arguments like on_click and on_change that are the most direct and convenient way to bind events to actions.

Here’s a quick app that shows how to make a NiceGUI app perform actions in response to events:

python

from nicegui import ui

def on_button_click():
    ui.notify("Button was clicked!")

def on_checkbox_change(event):
    state = "checked" if event.value else "unchecked"
    ui.notify(f"Checkbox is {state}")

def on_slider_change(event):
    ui.notify(f"Slider value: {event.value}")

def on_input_change(event):
    ui.notify(f"Input changed to: {event.value}")

ui.label("Event Handling Demo")

ui.button("Click Me", on_click=on_button_click)
ui.checkbox("Check Me", on_change=on_checkbox_change)
ui.slider(min=0, max=10, value=5, on_change=on_slider_change)
ui.input("Type something", on_change=on_input_change)

ui.run(title="NiceGUI Events & Actions Demo")

In this app, we first define four functions we’ll use as actions. When we create the control elements, we use the appropriate argument to bind an event to a function. For example, in the ui.button element, we use the on_click argument, which makes the button call the associated function when we click it.

We do something similar with the other elements, but use different arguments depending on the element’s supported events.

You can check the documentation of elements to learn about the specific events they can handle.

Using the on_* type of arguments is not the only way to bind events to actions. You can also use the on() method, which allows you to attach event handlers manually. This approach is handy for less common events or when you want to attach multiple handlers.

Here’s a quick example:

python

from nicegui import ui

def on_click(event):
    ui.notify(f"Button was clicked!")

def on_hover(event):
    ui.notify(f"Button was hovered!")

button = ui.button("Button")
button.on("click", on_click)
button.on("mouseover", on_hover)

ui.run()

In this example, we create a small web app with a single button that responds to two different events. When you click the button, the on_click() function triggers a notification. Similarly, when you hover the mouse over the button, the on_hover() function displays a notification.

To bind the events to the corresponding function, we use the on() method. The first argument is a string representing the name of the target event. The second argument is the function that we want to run when the event occurs.

Conclusion

In this tutorial, you’ve learned the basics of creating web applications with NiceGUI, a powerful Python library for web GUI development.

You’ve explored common elements, layouts, and event handling. This gives you the foundation to build modern and interactive web interfaces. For further exploration and advanced features, refer to the official NiceGUI documentation.

Planet Python

If you see these icons on your Windows taskbar, open your privacy panel immediately

https://static0.makeuseofimages.com/wordpress/wp-content/uploads/wm/2025/11/asus-vivobook-laptop-showing-windows-11-desktop-with-taskbar.jpg

The Windows taskbar is something that we see all the time, but don’t pay much attention to. It’s there. It exists. And if you’re like most people, you probably only use it for interacting with the Start menu, switching apps, or accessing the Quick Settings every now and then.

But hidden in that quiet corner of your screen are a few icons that deserve way more attention than they get. These icons appear when apps are using sensitive features like your microphone or your location. And if you ignore them for too long, you might be giving away more of your privacy than you realize.

Most people ignore these taskbar icons, but they’re crucial

These icons are trying to tell you something

Every time an app uses your microphone, you’ll see a tiny microphone icon right next to the system tray. If you hover over it, Windows will show you the name of the app that’s using it. If multiple apps are listening or recording at once, Windows will list all of them.

This works the same way for location access. When an app is accessing your location, you’ll see a tiny arrow instead. And if both your microphone and location are being accessed at once, you’ll see both icons stacked together.

The problem is that most people never notice these indicators, or they see them and never bother to check what they mean. Also, these icons disappear as soon as the app stops using the microphone or location, so they are very easy to miss. It’s not like your webcam’s LED indicator that lights up right in front of you. They’re small, quiet icons that appear in a corner you rarely focus on, but they’re just as important.

A look at the privacy menu can reveal more

The activity log most people never open

Even if you miss the microphone and location taskbar icons, you can still check which apps are using your PC’s sensitive features. For that, you need to dive into Windows’ privacy settings.

Head to Settings > Privacy & security > App permissions and click Microphone. Expand Recent activity, and you’ll see a list of apps that have accessed your mic in the past 7 days. It also shows the exact date and time each app used it. This makes it easy to determine whether the activity lines up with something you actually did, like joining a video call, or whether an app accessed your mic when you were not expecting it.

The same applies for location tracking. Go back to App permissions and click Location instead. You will see which apps have used your location and when. And while Windows doesn’t show a camera icon when an app is using your webcam, you can find details about camera activity in the privacy menu.

This menu is basically a detailed history of which apps have been peeking behind the curtain. The taskbar icons show you what’s happening in the moment, and the privacy settings show you what has been happening over time.

Windows laptop showing local account

Become a ghost on your Windows PC.

Stop these apps from invading your privacy before it’s too late

Cut off unnecessary access

Microphone permission menu in Windows 11
Screenshot by Pankil Shah — No attribution required

Knowing which apps are accessing your microphone, camera, or location is only half the battle. If something looks suspicious, you also need to know how to put a stop to it. Of course, the most straightforward way is to just uninstall the app or program, but that’s not always an option or even necessary. In some cases, you might actually need the app, just not its constant access to your personal data.

To get around this, you can revoke camera, location, or microphone permissions for such apps. Head to Settings > Privacy & security > App permissions and select the permission you want to manage. Then expand Let apps access your camera/microphone/location and use the toggles to revoke access for apps that don’t need it.

One tricky part is that when a website uses your microphone or location, Windows’s taskbar icon or privacy menu will only show the name of the browser. This means you won’t be able to tell which website was actually accessing it from the taskbar.

If you don’t want to revoke camera or microphone access for your browser entirely, most browsers also show information about which websites have accessed your PC’s sensitive features like the camera, microphone, or location. For instance, in Edge, you can head to Settings > Privacy, search, and services > Site permissions > Recent activity to see if any website has accessed your camera, microphone, or location. You can then click on the website that looks suspicious and block its access from there.


Most of us don’t really pay much attention when setting up an app for the first time. In a rush to try something new, we often grant all the permission an app needs without thinking it through. The good thing is that Windows has your back and can notify you when apps use sensitive information. But it is still up to you to notice those indicators and act on them before they become a bigger problem.

MakeUseOf

Save 40% on any Plex Pass with Black Friday & Cyber Monday deals

https://photos5.appleinsider.com/gallery/65855-137968-plex-pass-black-friday-sale-xl.jpgPlex’s biggest sale of the year starts now, with a 40% Black Friday and Cyber Monday discount on your choice of a monthly, annual, or lifetime Plex Pass.

Plex Pass colorful media interface featuring cartoon family, music, and streaming options with text: 'Press play on your personal media' against a purple background, along with geometric icons.
Save 40% with Plex Pass Black Friday deal – Image credit: Plex

Black Friday week is here, and Plex is kicking off its biggest sale of the year that runs now through Cyber Monday. Save 40% on any Plex Pass plan — with prices starting at $4.19 for your first month.

AppleInsider News

Chris Hemsworth and dad fight Alzheimer’s with a trip down memory lane

https://cdn.arstechnica.net/wp-content/uploads/2025/11/roadtripTOP-1152×648-1763557115.jpg

Millions of people around the world are living with the harsh reality of Alzheimer’s disease, which also significantly impacts family members. Nobody is immune, as A-list actor Chris Hemsworth discovered when his own father was recently diagnosed. The revelation inspired Hemsworth to embark on a trip down memory lane with his father, which took them to Australia’s Northern Territory. The experience was captured on film for A Road Trip To Remember, a new documentary film from National Geographic.

Director Tom Barbor-Might had worked with Hemsworth on the latter’s documentary series, Limitless, also for National Geographic. Each episode of Limitless follows Hemsworth on a unique challenge to push himself to the limits, augmented with interviews with scientific experts on such practices as fasting, extreme temperatures, brain-boosting, and regulating one’s stress response. Barbor-Might directed the season 1 finale, “Acceptance,” which was very different in tone, dealing with the inevitability of death and the need to confront one’s own mortality.

“It was really interesting to see Chris in that more intimate personal space, and he was great at it,” Barbor-Might told Ars. “He was charming, emotional, and vulnerable, and it was really moving. It felt like there was more work to be done there.” When Craig Hemsworth received his Alzheimer’s diagnosis, it seemed like the perfect opportunity to explore that personal element further.


Director Tom Barbor-Might behind the camera during production of the documentary.

Director Tom Barbor-Might behind the camera during filming of the documentary.

National Geographic/Craig Parry

Director Tom Barbor-Might behind the camera during filming of the documentary.

National Geographic/Craig Parry


Scientist Suraj Samtani chats with Chris about the potential benefits of reminiscence therapy.

Scientist Suraj Samtani chats with Chris Hemsworth about the potential benefits of reminiscence therapy.

National Geographic

Scientist Suraj Samtani chats with Chris Hemsworth about the potential benefits of reminiscence therapy.

National Geographic

Director Tom Barbor-Might behind the camera during filming of the documentary.

National Geographic/Craig Parry

Scientist Suraj Samtani chats with Chris Hemsworth about the potential benefits of reminiscence therapy.

National Geographic

Hemsworth found a scientific guide for this journey in Suraj Samtani, a clinical psychologist at the New South Wales Center for Healthy Brain Aging who specializes in dementia. Recent research has shown that one’s risk of dementia can be reduced by half by maintaining regular social interactions and even after a diagnosis, fostering strong social connections can slow cognitive decline. Revisiting past experiences, including visiting locations from one’s past, can also boost cognition in those with early-onset dementia or Alzheimer’s—hence the Hemsworth road trip.

The first stage was to re-create the Melbourne family home from the 1990s. “The therapeutic practice of reminiscence therapy gave the film not only its intellectual and emotional underpinning, it gave it its structure,” said Barbor-Might. “We wanted to really explore this and also, as an audience, get a glimpse of their family life in the 1990s. It was a sequence that felt really important. The owner extraordinarily agreed to let us revert [the house]. They went and lived in a hotel for a month and were very, very noble and accommodating.”

Ars Technica – All content

Return to the year 2000 with classic multiplayer DOS games in your browser

https://cdn.arstechnica.net/wp-content/uploads/2025/11/screen1c-1152×648.jpg

Over the past couple of weeks, friends and colleagues have made me aware of multiple ingeniously implemented, browser-based ways to play classic MS-DOS and Windows games with other people on basically any hardware.

The late 1990s and early 2000s were the peak of multiplayer gaming for me. It was the era of real-time strategy games and boomer shooters, and not only did I attend many LAN parties, but I also played online with friends.

That’s still possible today with several old-school games; there are Discord servers that arrange scheduled matches of Starsiege Tribes, for example. But oftentimes, it’s not exactly trivial to get those games running in modern Windows, and as in the old days, you might have some annoying network configuration work ahead of you—to say nothing of the fact that many folks who were on Windows back in those days are now on macOS or Linux instead.

Read full article

Comments

Ars Technica – All content

AWS Organizations now supports upgrade rollout policy for Amazon Aurora and Amazon RDS

Today, AWS Organizations announces support for upgrade rollout policy, a new capability that helps customers stagger automatic upgrades across their Amazon Aurora (MySQL-Compatible Edition and PostgreSQL-Compatible Edition) and Amazon Relational Database Service (Amazon RDS) including RDS for MySQL, RDS for PostgreSQL, RDS for MariaDB, RDS for SQL Server, RDS for Oracle, and RDS for Db2 databases. This capability eliminates the operational overhead of coordinating automatic minor version upgrades either manually or through custom tools across hundreds of resources and accounts, while giving customers peace of mind by ensuring upgrades are first tested in less critical environments before being rolled out to production.

With upgrade rollout policy, you can define upgrade sequences using simple orders (first, second, last) applied through account-level policies or resource tags. When new minor versions become eligible for automatic upgrade, the policy ensures upgrades start with development environments, allowing you to validate changes before proceeding to more critical environments. AWS Health notifications between phases and built-in validation periods help you monitor progress and ensure stability throughout the upgrade process. You can also disable automatic progression at any time if issues are detected, giving you complete control over the upgrade journey.

This feature is available in all AWS commercial Regions and AWS GovCloud (US) Regions, supporting automatic minor version upgrades for Amazon Aurora and Amazon RDS database engines. You can manage upgrade policies using the AWS Management Console, AWS CLI, AWS SDKs, AWS CloudFormation, or AWS CDK. For Amazon RDS for Oracle, the upgrade rollout policy supports automatic minor version upgrades for engine versions released after January 2026.

To learn more about automatic minor version upgrades, see the Amazon RDS and Aurora user guide. For more information about upgrade rollout policy, see Managing organization policies with AWS Organizations (Upgrade rollout policy).

Planet for the MySQL Community

How Airstream Trailers Are Made

https://theawesomer.com/photos/2025/11/airstream_trailer_factory_t.jpg

How Airstream Trailers Are Made

Airstream’s aluminum trailers have been icons of Americana since the 1930s. This look inside their Jackson Center, Ohio factory shows how craftspeople rivet aluminum panels around ribs, shape end caps, mount the shell to its chassis, and install windows and curved doors. After weather-testing each exterior, they build out the interior living space.

The Awesomer

This Linux tool maps your online footprint in minutes

https://static0.makeuseofimages.com/wordpress/wp-content/uploads/wm/2025/11/scanning-your-online-info-with-theharvester.jpg

Your digital footprint is often larger than you think. It includes all the emails you’ve sent, subdomains you’ve created, and the services you signed in to, not to mention the alarming amount of information Google knows about you. In many cases, this data is visible, and mapping it takes just a few minutes. Certain tools collect public data, revealing exactly what anyone can see about you online. This practice is known as Open Source Intelligence (OSINT). The thing is that if you can do it, so can anyone else.

theHarvester is one of the most easily accessible tools for this. With the right commands, it gathers data from search engines and public repositories. It even accesses security APIs, revealing hosts, emails, and subdomains you forgot about. I got my hands on this tool, and it taught me how exposed we can be.

OS

Linux

Price model

Free

theHarvester is a tool for Open Source Intelligence. It gathers subdomain names, e-mail addresses, virtual hosts, open ports or banners from public locations. 

 

Setting up theHarvester

Even though theHarvester may sound like a specialized cybersecurity tool (it comes preinstalled on the pentesting-focused distro, Kali Linux), I use it on Linux Mint, and installation is quite easy. You only need to clone theHarvester from its GitHub repository to guarantee you have the latest version and all current APIs and modules.

  1. Launch your terminal and run the commands below:

     sudo apt install git python3-venv -y

    git clone https://github.com/laramies/theHarvester.git

    cd theHarvester

    python3 -m venv venv
    source venv/bin/activate

    pip install .
  2. After the installation finishes, run the command below to confirm it is working:

    theHarvester -h

You should see theHarvester’s menu as confirmation that it has been properly installed.

theHarvester obtains publicly available information using DuckDuckGo, CRT.sh, CertSpotter, DNSDumpster, VirusTotal, and other certificate and threat-intel feeds. You can integrate free API keys for Shodan or Hunter.io by directly adding them to theHarvester’s api-keys.yaml file. This will give your results a boost, even though the tool is still very capable without this upgrade.

Running your first scan

Mapping what the internet already knows about you

Now that you’re set up, it’s time to discover what your online footprint looks like. To start, launch the terminal in theHarvester’s folder and run the command below, replacing example.com with a test domain or an actual one.

theHarvester.py -d example.com -b all -l 100

You can also run the command below from a general terminal to launch theHarvester.

Using the -b all flag in the command above lets theHarvester search in all available data sources, and -l 100 will limit the results so they’re readable.

Shortly, results will appear in the terminal. They typically contain emails, subdomains, hostnames, IP addresses, and sources. When I ran this search on a personal domain, I was surprised to see the amount of personal information I had floating on the internet—information anyone may find from public sources.

Running it on a domain you manage would probably reveal old emails connected to accounts you’ve forgotten and subdomains for test environments you no longer run. It does all this without invading privacy or bypassing security.

Making sense of the results

Understanding emails, subdomains, and digital exposure

The amount of information in the results can be intimidating; once you know what to look for, interpreting it becomes straightforward. The sections are different parts of your digital map. The Emails section appears first, showing publicly exposed contact points. For a company, you may see addresses such as support@domain.com, info@domain.com, or individual employee names. These details can become a weapon for attackers to send phishing emails or to identify hierarchy within an organization. For an individual, if the results show old emails, it should serve as a wake-up call to close those accounts or take steps to limit their online visibility.

Subdomains are another element to look out for. If the results return entries similar to test.example.com or oldblog.example.com, they can indicate forgotten servers or outdated sites. Unattended subdomains run on separate endpoints and can serve as entry points for attackers. You should clean them up or redirect them to reduce the risks of exposure.

The Hosts and IP Addresses section lists IP addresses and hosts. They can reveal outdated infrastructure and show where domains are hosted. However, in all this, the bigger picture is that what you consider hidden is, in fact, publicly available and not that difficult to retrieve.

Simple ways to tighten your digital security right now

It’s unsettling to see your digital footprint laid out in theHarvester’s results, but it’s good to have this awareness. It gives you an idea of how to act to shrink it. A drastic approach can be removing yourself entirely from the internet.

However, a less aggressive starting point is subdomain hygiene. Disable or delete unused accounts and decommission or secure unused subdomains/staging environments. Every deactivated subdomain is one less risk.

Also, tackle email exposure. You may use email aliases for addresses that are easily searchable. I personally use aliases for almost everything, especially online shopping. So rather than afam@yourdomain.com, you use newsletter@yourdomain.com. This will shield your primary inbox from being listed in public databases.

Last but not least, conceal domain registration details. A WHOIS lookup service can show if your personal information is publicly visible; if so, enable domain privacy protection via your registrar.

The bigger picture

TheHarvester is a mirror that displays exactly what someone may find about you online if they know where to look. For me, it started as a simple scan but quickly became a realization that the web remembers too much—connections, emails, and forgotten pages.

Awareness is key—you can’t take control if you’re uninformed. While this tool is great for managing an organization’s domain, it’s also useful for personal sites. Regular checks are a small habit that ensures your online presence is secure.

MakeUseOf