Hardware FixRecommendedDevice not working? Your driver may be the problemCheck updates for common hardware issues.Fix DriversHalloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsPC HealthRecommendedCrashes, freezes, slowdowns? Check your PC nowSpot repairable issues before they interrupt work.Check PC×
Skip to content
World desk13 min

How to Use Full-Text Search in PostgreSQL on a Linux VPS

A practical guide to native PostgreSQL full-text search on a Linux VPS, covering configuration, generated tsvector columns, GIN indexes, safe query parsing, ranking, highlighting, operations, and when an external search engine is justified.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

PostgreSQL can provide production-grade full-text search without a second search service. Store a normalized tsvector for each document, query it with a safely parsed tsquery, and add a GIN index. On a Linux VPS, the reliable pattern is a fixed text-search configuration, a stored generated column, and queries built with websearch_to_tsquery for ordinary search-box input.

What PostgreSQL full-text search actually does

PostgreSQL full-text search (FTS) is designed for finding natural-language documents that best match a query. It is different from a case-insensitive substring search such as WHERE body ILIKE '%term%': PostgreSQL tokenizes text, normalizes words into lexemes, records positions, and can apply language-specific stemming and stop-word rules.

As an Amazon Associate I earn from qualifying purchases.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Two native data types form the system:

  • tsvector is the normalized representation of a document. It is a sorted list of distinct lexemes, optionally carrying word positions and field weights.
  • tsquery is the normalized representation of a search expression. It describes which lexemes, phrases, proximity relationships, or exclusions should match.

The match operator is @@. A typical query converts the stored document and the user’s text into those types, then tests the match:

SELECT to_tsvector('english', 'The Fat Rats');

SELECT websearch_to_tsquery('english', '"fat rat" or cat -dog');

SELECT id, title
FROM articles
WHERE search_vector @@ websearch_to_tsquery('english', :search_text);

The selected configuration matters. With english, words are stemmed and common stop words may be discarded. With simple, token normalization is less language-specific and is useful when exact token behavior is preferred. Use a suitable installed configuration for another language. Changing the configuration changes the lexemes in the index, so treat it as a schema or deployment decision rather than an incidental query option.

#1 Best Overall
Sale
TOZO A1 Wireless Earbuds Bluetooth 5.3 Light Weight in Ear Headphones | IPX5 Waterproof,2 Mics for AI Calls,Immersive Premium Sound Bass Headset with Charging Case,32 EQ via App Black
  • [Ultra-Lightweight Ear Buds Designed for Small Ears] Each earbud weighs only 3.7g and features a compact, ergonomic in-ear design made especially for small ears. Secure, low-profile, and comfortable for workouts, all-day wear or overnight sleeping.The ultra-slim profile sits flush in your ear with no hard edges poking or rubbing, so you can even sleep on your side without discomfort.
  • [Immersive Stereo Sound with TOZO OrigX Technology] TOZO OrigX tuning delivers clear vocals, balanced mids, and natural stereo sound for music, podcasts, and videos.
  • [Long Battery Life for Daily Use] Get up to 7 hours of playtime on a single charge, with up to 32 hours total using the charging case—ideal for workdays, commuting, and extended listening sessions.
  • [Bluetooth 5.3 & Stable Connection] Bluetooth 5.3 provides fast pairing, stable wireless performance, and reduced dropouts as you move around home or office.
  • [Deep Bass with Clear Vocals] High-performance drivers produce punchy bass while keeping vocals clean and detailed for everyday listening.

Plan the VPS installation before creating the index

Verify the PostgreSQL major version

PostgreSQL package names, service commands, default data directories, and authentication defaults vary by Linux distribution. Install the server and client from your distribution packages or the PostgreSQL project repository, initialize a cluster if your distribution requires it, and check the installed major version before applying SQL. The current PostgreSQL type and function documentation is for version 18; the indexing examples are also documented for supported earlier major versions. Syntax shown here is intended for modern PostgreSQL, but your installed major version is the authority.

On a Debian- or Ubuntu-like system, an illustrative installation is:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
sudo apt update
sudo apt install postgresql postgresql-client
sudo systemctl enable --now postgresql
psql --version

On an RPM-based system, package and initialization steps can differ. A typical starting point is:

sudo dnf install postgresql-server postgresql
# Run the distribution's documented cluster-initialization command if required.
sudo systemctl enable --now postgresql
psql --version

Do not assume these commands apply unchanged to every distribution or repository. Record the major version, Linux distribution, locale, and text-search configuration in deployment documentation.

Create a least-privilege database role

Create the application database and a role that has only the privileges it needs. Keep administrative access separate from the account used by the web application. Restrict network exposure with the VPS firewall and PostgreSQL’s pg_hba.conf; do not open the database to the entire internet simply because the application is hosted on the same VPS.

Connect locally as an administrator and create the database and role using your own names:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
sudo -u postgres psql

CREATE ROLE app_user LOGIN PASSWORD 'use-a-secret-from-your-secret-store';
CREATE DATABASE app_db OWNER app_user;
c app_db
GRANT CONNECT ON DATABASE app_db TO app_user;

Use a secret manager or protected environment configuration for the password. Bind values in application SQL rather than concatenating user input.

Choose a stable text-search configuration

Use english when your corpus is English and stemming and stop-word behavior are desirable. Use simple when you want predictable token normalization without English stemming, or select an appropriate language configuration for your corpus. The configuration name must be identical when the vector is generated, when an expression index is defined, and when the query is built.

Rank #2
Sale
Smart Watch for Men Women Compatible with iPhone Samsung Android Phone 1.69 inch Full Touch Screen IP68 Waterproof Bluetooh Fitness Tracker Heart Rate/Sleep Monitor (Black)
  • 【IP68 Waterproof Multifunctinal Smart Watch】Torjalph fitness activity tracker smart watch is IP68 waterproof technology ,you can wear it when swimming,handwashing,it's rain-proof which means that you perform multiple exercise modes outside without worrying about sweat or rain corroding your fitness smart watch,and this watch equipped with a 230 mAh large capacity battery magnetic charging ,and this sports activity tracker watch can be used 5-7 days If fully charged.
  • 【Larger 1.83'' Full Screen Watch & Multi-dial Selection】1.83 inch full HD color touch screen smart watch for men / women provides excellent 240*284 resolution image quality ,This Bluetooth smart watch offers a better touch experience and remarkable immersion and ,more than 200 watch faces for you to choose from App"Da Fit ", you can change the dial style according to your mood to wear keeping the world on your wrist
  • 【Accurate Activity Tracker Smart Watch 】sports watch activity tracker uses sweat and dust resistant breathable silicone strap, our Fitness Tracker Smart Watch for Android iOS Phones supports 12 sports modes,walking,running,bicycle,swimming,badminton,basketball,football,rope skipping. This bluetooth calls smart watch for men women is lightweight and stylish, bringing more convenient and relaxing sports experience while also providing more protection.
  • 【Your 24 Hour Personal Daily Health Monitor】Fitness watch for women men full touch screen IP67 waterproof bluetooth smartwatch for Android iOS Phones with heart rate blood pressure monitor multifunction Andriod smart watch with steps counter sleep monitor sports fitness watch, monitoring blood oxygen saturation allows you to understand your physical condition in real time to track fitness progress ,to know your health status in time.
  • 【More Functions Bluetooth Call Smart Watch】This fitness activity smart watch full screen for iPhone and Android phones includes a bunch of new features including:The bluetooth smart watch can hang up the phone, receive and display WhatsAPP /Text /Facebook /Twitter /Messenger reminder.Support sedentary reminder, alarm clock, stopwatch, timer,weather information,music control, remote camera control compatible with Android 5.0 and above or iOS 9.0 and above smartphones.

A configuration change is not a harmless setting toggle. For example, an English stemmer may index “running” as a different lexeme from the literal token, while simple preserves different forms. If you intentionally change dictionaries, stop-word files, or the configuration itself, plan a rebuild or reindex so old and new lexemes do not coexist unexpectedly.

Build a stored search vector

Keep the original title and body in ordinary columns and materialize a generated tsvector. A stored generated column recalculates when source text changes, so application code does not have to remember a separate update statement.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
CREATE TABLE articles (
  id            bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  title         text NOT NULL,
  body          text,
  published_at  timestamptz NOT NULL DEFAULT now(),
  search_vector tsvector GENERATED ALWAYS AS (
    setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
    setweight(to_tsvector('english', coalesce(body,  '')), 'D')
  ) STORED
);

Why coalesce is essential

Concatenation with a null value can produce null. If body is nullable and you call to_tsvector on an unhandled null, the resulting document can lose all searchable content. coalesce(body, '') converts a missing field to an empty string. Apply the same treatment to every nullable field included in the document.

Use weights to represent document structure

setweight labels lexemes according to their source field. PostgreSQL’s conventional weights run from A (highest) through D (lowest), so the example gives a title weight of A and a body weight of D. You can add an excerpt, tags, or an author field with intermediate weights when those fields are genuinely part of relevance.

The generated expression is deterministic: the same source values and configuration produce the same vector. Avoid changing the configuration name in only one part of the system; a query built with a different configuration may contain lexemes that never occur in the indexed vector.

Add the GIN index

For a frequently searched tsvector, GIN is PostgreSQL’s preferred text-search index type. It is an inverted index: each lexeme maps to the rows containing it.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
CREATE INDEX articles_search_vector_gin
  ON articles USING GIN (search_vector);

The index accelerates the match predicate, not every part of a query. PostgreSQL may still sort matching rows for relevance, apply additional filters, or fetch table data. The only dependable latency figure is the one measured with your corpus, hardware, concurrent workload, and query mix on the target VPS.

Build large indexes safely

Creating an index on a large, busy table can hold locks or consume substantial I/O. Schedule a maintenance window when appropriate. Where your deployment policy permits it, evaluate CREATE INDEX CONCURRENTLY to reduce blocking of writes:

Rank #3
New Bee Guitar Cable 10ft Electric Instrument Bass AMP Cord
  • [Low Noise High Fidelity] New bee guitar cord with 22AWG oxygen-free-copper center conductors provides enhanced signal transfer, the PVC insulation material and the high-density stranded copper double shield provide noise rejection for quiet operation
  • [Ideal for Choice] New bee 1/4 straight and right angle metal connectors, ensures a secure connection in any instrument, pedal, or amp jack. L shape great fro on stage guitar stands
  • [Wide Compatible] Suitable for mixer, power amplifier, microphone, effector, decoder, equalizer, electoronic organ, electric guitar, electric bass and other electronic equipments. Widely used in the installation of smart home, karaoke speaker, professional stage audio, etc
  • [Easy Disassemble] Making incidental repairs quick and easy! Very nice, flexible cable
  • [Dont Hesite to Order] 24 hours customer services and professional technology team are standing by
CREATE INDEX CONCURRENTLY articles_search_vector_gin
  ON articles USING GIN (search_vector);

Concurrent creation has operational restrictions and takes longer; follow the rules for your PostgreSQL major version and migration system. Do not run it inside a transaction block.

Parse search-box input with the right query function

Do not send raw, untrusted text to to_tsquery. That function exposes PostgreSQL’s operator syntax and requires valid operators, so malformed input can fail and unrestricted input can express more than a normal user expects. Bind search text as a parameter and use websearch_to_tsquery for a web-style search box.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
User intent Function Behavior
Search-box text with quotes, or, and exclusions websearch_to_tsquery Accepts quoted phrases, the word or, and dash-based NOT syntax without requiring users to learn PostgreSQL operators.
Plain text where every non-stopword should be required plainto_tsquery Converts ordinary text into an AND query and treats punctuation as ordinary input rather than operators.
Exact phrase intent phraseto_tsquery Builds phrase and distance operators that preserve word order.
Trusted administrative or program-generated syntax to_tsquery Provides full operator control, but the input must contain valid tsquery operators.

For a user-facing endpoint, a parameterized query can look like this:

SELECT id, title, published_at
FROM articles
WHERE search_vector @@ websearch_to_tsquery('english', :search_text)
ORDER BY published_at DESC
LIMIT 20;

Here :search_text is a bind parameter supplied by the database driver. Never construct SQL by inserting the search string into the statement text.

Rank matches and return highlighted snippets

A Boolean match only answers whether a row satisfies the query. Ranking supplies a relevance signal for ordering. PostgreSQL provides ts_rank and ts_rank_cd; the latter uses cover density, which considers how closely matching terms occur together.

SELECT id,
       title,
       published_at,
       ts_rank_cd(search_vector, q) AS relevance,
       ts_headline(
         'english',
         body,
         q,
         'StartSel=<mark>,StopSel=</mark>,MaxFragments=2'
       ) AS snippet
FROM articles,
     websearch_to_tsquery('english', :search_text) AS q
WHERE search_vector @@ q
ORDER BY relevance DESC, published_at DESC, id
LIMIT 20;

The query is computed once as q and reused for the match, rank, and snippet. ts_headline generates excerpts and marks matches; MaxFragments=2 limits the number of fragments in this example. Escape or sanitize generated HTML according to your application output policy before inserting snippets into a page.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Make relevance ordering deterministic

Rank values can tie. Add a stable secondary order, such as publication time and the primary key, so repeated requests do not shuffle equal results. Rank is a relevance signal, not a guarantee that the first row is objectively the best document; tune weights and ranking options against real user expectations.

Apply custom weight priorities

When title matches should count more than body matches, combine weighted vectors with a matching weight array passed to the ranking function:

Rank #4
BSIMB 15.6" Digital Family Calendar & Chore Chart, No Subscription Fees
  • Digital Family Calendar: BSIMB digital calendar wall touch screen puts an end to your chaotic life. Designed for busy families, the digital calendar keeps you organised and in step with your family. Assign different colours and tasks to each family member to make family scheduling easier and more intuitive.
  • Easy Setup and Auto-Sync: Plug in, connect to WLAN and auto-syn your electric calendar in minutes. Digital wall calendar compatible with Google calendar, iCloud calendar, Outlook calendar, Cozi calendar and Yahoo calendar. Add events directly on the device or through the ecalendar app. Electronic calendar stays current whether you're at work or traveling—no manual updates needed.
  • All-In-One Home Assistant: Smart calendar builds habits and encourage independence with personalised chores. Display daily meal plan to reduce the daily ‘What's for dinner?’ stress. To-do lists keep track of everything you want. Turning chores into valuable achievements with stars and rewards, making life easier and more enjoyable.
  • Manage Anytime Anywhere: BSIMB electronic calendar for family stay connected with the powerful ecalendar app. Access and manage your digital wall calendar anytime, anywhere with free features like stars & rewards, photo screensaver, chore charts, meals plans, to-do lists etc. Electronic planner paid features like Magic Import tailor advanced tools for users with special needs.
  • Stay in Touch with Loved Ones: Share photos or videos from your phone to electronic wall calendar with app, instantly update your life moment, and keep in touch with your family, especially those who are far away; you can also surprise your smart calendar digital wall by sending him a wish card; it's also great for keeping tech-illiterate elders in touch with the youngsters.
SELECT id,
       title,
       ts_rank_cd('{0.1, 0.2, 0.4, 1.0}', search_vector, q) AS relevance
FROM articles,
     websearch_to_tsquery('english', :search_text) AS q
WHERE search_vector @@ q
ORDER BY relevance DESC, id;

The array corresponds to PostgreSQL’s D-through-A weight order. Keep the weighting policy in application documentation and validate it with representative searches; larger numbers do not automatically make a ranking useful if the corpus or query mix changes.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use an expression index when a stored column is unnecessary

A smaller schema can index the expression directly instead of storing a generated vector:

CREATE INDEX articles_fts_expr_gin
  ON articles USING GIN (
    to_tsvector('english', coalesce(title, '') || ' ' || coalesce(body, ''))
  );

SELECT id, title
FROM articles
WHERE to_tsvector('english', coalesce(title, '') || ' ' || coalesce(body, ''))
      @@ websearch_to_tsquery('english', :search_text);

This saves a column but repeats the expression in every matching query and gives you less visibility into the materialized representation. PostgreSQL requires the configuration to be explicit in an expression index using to_tsvector. The query expression must use the same configuration and equivalent expression for the index to be eligible. If you later change the configuration or expression, create the replacement index and plan the migration deliberately.

Choose GIN or GiST deliberately

Index type Typical choice Important behavior
GIN Normal application search over a frequently queried tsvector Preferred text-search index; inverted structure generally gives precise lexeme-to-row lookups, with write and storage costs that must be measured on your workload.
GiST Cases where GiST integration or a smaller/faster-to-build index is more important than maximum text-search lookup performance Uses a lossy signature. False matches can require heap rechecks. Increasing siglen improves precision but increases index size.

Start with GIN for the common search-column pattern. Consider GiST only after identifying a concrete reason in your workload and verifying the trade-off with execution plans and resource measurements.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Operate and tune FTS on a Linux VPS

Inspect the real execution plan

Run representative searches with buffers enabled:

EXPLAIN (ANALYZE, BUFFERS)
SELECT id, title
FROM articles
WHERE search_vector @@ websearch_to_tsquery('english', 'database tuning')
ORDER BY published_at DESC
LIMIT 20;

Confirm that PostgreSQL considers the GIN index and inspect rows removed by filters, heap fetches, buffer reads, and sort work. Test common terms, rare terms, phrase searches, empty input, and searches combined with your normal date or tenant filters. An index that is beneficial for a rare term may not be selected for a very common term, and that can be a valid planner decision.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Keep statistics and vacuum healthy

  • Run ANALYZE after bulk loads or major data distribution changes so the planner has current statistics.
  • Monitor table and index growth, disk headroom, write amplification, and vacuum activity.
  • Make sure autovacuum is keeping up with updates to source text; every update can change the generated vector and its index entries.
  • After intentional dictionary, stop-word, or configuration changes, rebuild or reindex according to your migration plan.
ANALYZE articles;

Account for write and storage costs

FTS adds CPU during vector generation and index maintenance during inserts and updates. A generated column centralizes correctness but does not make the work free. On a small VPS, watch CPU, memory, disk latency, and WAL volume while loading realistic batches. Separate search traffic from bulk imports when possible, and schedule large index builds when they will not compete with peak application traffic.

Keep configuration reproducible

Record the PostgreSQL major version, Linux distribution, locale, text-search configuration, custom dictionaries, index definitions, and migration order. A restored database or replacement VPS should create the same lexemes and use the same query functions. Configuration drift is a common reason for apparently missing matches after a deployment.

Secure the search endpoint

  • Use a bind parameter for the complete user search string.
  • Use websearch_to_tsquery for ordinary users and reserve to_tsquery for trusted, validated syntax.
  • Decide how your API handles an empty or stop-word-only query. Return a clear validation response rather than issuing an unbounded result query.
  • Limit result counts and enforce authorization, tenant, and publication filters in the same SQL statement.
  • Escape highlighted output before rendering it as HTML, especially when source documents can contain markup.
  • Restrict PostgreSQL network access with the VPS firewall and precise pg_hba.conf rules.

Troubleshoot common failures

The query returns no rows even though the words are visible

Check that the vector and query use the same configuration. English stemming, stop words, punctuation, and tokenization can all make the indexed lexeme differ from the text you see. Inspect both sides directly:

SELECT to_tsvector('english', 'Running databases efficiently');
SELECT websearch_to_tsquery('english', 'running database');

Also verify that nullable fields use coalesce, that the row has been committed, and that the query is searching the intended column or expression.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The index is not used

Run EXPLAIN (ANALYZE, BUFFERS). For an expression index, compare the query expression character-for-character in meaning, including the explicit configuration and null handling. For a generated column, ensure the predicate is on the indexed search_vector column rather than a different ad hoc expression. Run ANALYZE after a bulk load and check whether the planner reasonably prefers a sequential scan for a very common term.

Search input causes syntax errors

That usually indicates raw text is being passed to to_tsquery. Switch ordinary search-box input to websearch_to_tsquery, bind it as a parameter, and reserve operator syntax for trusted administrative features.

Results are relevant but ordered poorly

Use setweight so title, tags, and body have intentional priorities. Compare ts_rank and ts_rank_cd on representative searches, add a deterministic secondary sort, and adjust the weight array only after examining real result sets. Do not infer quality from the numeric rank alone.

Updates make the VPS slow

Measure index and table write activity, autovacuum lag, WAL growth, and disk latency. Large text updates rewrite the generated vector and index entries. Batch imports, schedule index creation outside peak periods, and verify that the VPS has sufficient storage and I/O capacity before increasing concurrency.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

When PostgreSQL is enough—and when to add a search engine

Native FTS is a strong fit when documents already live in PostgreSQL, SQL joins and authorization filters are central, fresh writes should be searchable without a separate ingestion pipeline, and one database simplifies operations. It keeps transactionally related data and search predicates in one system.

Compare an external search engine when your requirements include very large or cross-node search workloads, advanced fuzzy or typo tolerance, specialized language analyzers, extensive relevance tooling, or horizontal search scaling that should be independent of the primary database. Evaluate:

  • Corpus size and growth rate.
  • Required freshness between a write and its appearance in search.
  • Language coverage, stemming, synonyms, and custom analyzers.
  • Typo tolerance, autocomplete, faceting, and highlighting needs.
  • Operational complexity, replication, backups, and cross-node scaling.
  • Whether duplicating data introduces consistency and reindexing workflows your team can operate.

There is no universal PostgreSQL FTS latency number. Benchmark the target VPS, PostgreSQL major version, corpus, index, concurrent connections, and real query distribution before committing to a capacity target.

Production checklist

  • Confirm the installed PostgreSQL major version and Linux distribution-specific service behavior.
  • Create a dedicated application role with least privilege and protect its credentials.
  • Choose and document one text-search configuration for the corpus.
  • Use a stored generated tsvector with coalesce for nullable fields, or an equivalent explicit expression index.
  • Assign field weights intentionally, such as title A and body D.
  • Create a GIN index and verify it with EXPLAIN (ANALYZE, BUFFERS).
  • Use websearch_to_tsquery for user input; bind parameters and never concatenate SQL.
  • Use ts_rank or ts_rank_cd, then add deterministic tie-breakers.
  • Generate snippets with ts_headline and safely escape rendered markup.
  • Run ANALYZE after bulk loads and monitor vacuum, index growth, disk, CPU, and I/O.
  • Plan maintenance or concurrent index builds for large tables.
  • Reindex after intentional dictionary or configuration changes.
  • Benchmark the actual VPS workload instead of promising a generic response time.

With those controls in place, PostgreSQL gives a Linux VPS a coherent search stack: normalized documents in tsvector, safe user intent in tsquery, fast candidate lookup through GIN, and relevance and snippets produced in SQL. Move to a separate engine only when measured scale or search features justify the added operational system.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
PC Slower Than It Used to Be?Free scan - under a minute

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.