Commit Graph
15 Commits
Author SHA1 Message Date
Kumar ShivenduandClaude Opus 5 0fccb0cac1 Publish each page's markdown at /path.md as well as /path/index.md (#2743)
* feat(build): publish each page's markdown at /path.md as well as /path/index.md

Hugo writes the Markdown output format beside the HTML it belongs to, so a page
at /articles/foo/ is published at /articles/foo/index.md. That is correct and it
stays: it is what the llms.txt convention prescribes for directory-style URLs,
it is the form /llms.txt already advertises for 670 pages, and it is the target
of the <link rel="alternate" type="text/markdown"> we emit in every page head.

What it is not is guessable. Every other documentation site I compared exposes a
page's markdown by swapping the extension, so a client holding only a URL can
construct /articles/foo.md directly instead of first fetching the HTML to read
the alternate link:

  /articles/immutable-data-structures.md        404  ->  200 text/markdown
  /articles/immutable-data-structures/index.md  200      200 (unchanged)

So publish both. A post-build step copies every public/**/index.md to
public/**.md; the originals are untouched, so no published URL changes. Netlify
already serves .md as text/markdown, and the files are small: 7.6 MB against a
1.4 GB build, 0.5%.

Deliberately a build step rather than a Netlify redirect. A splat has to be
terminal, so /articles/*.md is not a pattern Netlify accepts, and a rule that
cannot be verified locally is worse than a copy that can.

Adds npm run md:test, which builds the site, runs the script over the output and
checks all 789 aliases exist and match their source byte for byte, that the
canonical index.md and index.html are untouched, that nothing is written outside
the publish directory, and that a second run overwrites nothing. Verified the
tests fail when the script is stubbed out.

The test deletes its build directory on exit. A build is ~1.4 GB, and a suite
that leaves temp directories behind fills a disk faster than anyone notices.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test(md): cut the alias tests down, and keep master's npm scripts

Review: the tests were redundant. Two of the four asserted what cp does, and
all four needed a full ~1.4 GB Hugo build to say it. Replaced with two tests
over a synthetic directory, covering the only two things the script decides:
skip the site root, never overwrite an existing file. 87 lines to 39, and the
run drops from a full site build to 0.26s.

package.json: this branch predates the charts work, so its scripts block
replaced master's. Merging as-is would have silently deleted viz:test and
viz:charts. Now keeps both and adds md:test.

Also trims the script's comment header from 19 lines to 8.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* test(md): drop the npm script, run the test file directly

package.json is the site's manifest; a runner alias for one shell script does
not belong in it. The test runs as:

  node --test test/markdown/aliases.test.mjs

package.json is now untouched by this branch, which also removes the risk of
the merge dropping master's viz scripts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-24 04:17:20 +05:30
Kumar Shivendu 6e4e414af5 Introduce interactive SVG charts (#2672)
7 charts across 5 posts, in 3 kinds: two-panel columns, grouped columns and faceted lines. Replaces 1,024 KB of raster screenshots with 71 KB of inline SVG, hover and keyboard focus included.

Charts are generated from CSVs and committed, so a changed number shows up as a diff in review. 

Pages also build as Markdown, where the shortcode emits the source data as a table instead of the raw SVG.
2026-09-24 01:56:49 +05:30
Kumar ShivenduandClaude Opus 5 eaf34e82f4 Link the two Dust case studies to each other (#2681)
* Link the two Dust case studies to each other

There are two Dust stories 15 months apart, and neither mentioned the
other. They are also reached from different places: the customers catalog
points at the 2025 one, while a Read Story card on the customers page and
the RAG use-cases page point at the 2024 one. A reader arriving at either
had no way to know the other existed.

The 2024 article now points forward from its Outlook section, which
already looks ahead to what Dust would build next. The 2025 article points
back before its first section, for anyone who wants the origin story.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Move the forward link to the top of the 2024 Dust story

At the end, in the Outlook section, it only reached readers who had
already finished the older story. Anyone who wanted the current numbers
needed it before they started reading, not after.

It now sits above the opening paragraph and is reframed to say which story
this is, rather than reading as a continuation of the outlook.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Update case study introduction for clarity

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 02:00:11 +05:30
Kumar ShivenduandClaude Opus 5 b2fb2ce337 Fix a broken paragraph in the Dust case study, and the card's screen reader output (#2680)
Three defects found auditing the merged quote work.

The Dust card at "solution of choice" had no blank line before or after it,
so it rendered inside the paragraph. A <figure> implicitly closes a <p>,
which left the following 60 words as a bare text node outside any
paragraph: 16px instead of 18px, tighter leading, and no bottom margin.
This is live on qdrant.tech today. Adding the blank lines restores it; the
file's words are unchanged, only whitespace.

The card also hid the company from screen readers. The logo carried
alt="", and the company name is display:none whenever a logo is present,
so on desktop a screen reader got the name and role and no company at all.
The logo now uses the company as its alt text, which is what it conveys.
The avatar becomes alt="" for the opposite reason - the name sits right
beside it, so repeating it just made the name announce twice.

Also restores the trailing newline on case-study-bayer.md.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 01:47:04 +05:30
Kumar ShivenduandClaude Opus 5 222226ba42 Apply the quote component to more case studies, and add a script to find the rest (#2648)
* Apply the quote component to OpenTable, &AI and Dust

Seven quotes, all verbatim. Only quotes that say something about Qdrant
were lifted; setup and problem-statement quotes stay in the prose they
were written for.

OpenTable has three different speakers, so each card names its own.

Two &AI quotes were split across "said Turner" in the original. Each card
carries only the contiguous half about Qdrant, and the setup fragment
stays in the prose - joining the halves would have meant editing his
words, even though every word was his.

Dust carried the same quote twice: once inside the alt text of
Dust-Quote.jpg and again as prose below it. The image is gone and the
words are a card, so the quote is now text rather than pixels and is no
longer duplicated.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Add a quote-finding script, and promote two lead quotes

Earlier passes over these files missed quotes because the search required
an attribution verb near the quotation. Anything attributed on its own
line with a dash, standing alone as an italic pull quote, sitting in a
blockquote, or buried in an image's alt text was never surfaced.

automation/find-customer-quotes.py reports all of those forms, and
deliberately over-captures: it flags any quoted run of 25 characters or
more outside front matter, code fences and existing shortcodes. A false
positive costs a moment's reading; a missed quote ships. Across the 52
case studies it finds 201 quotes still in prose.

Also promotes the strongest quote in two files to a lead card, taking the
logo with it so it stays on the first card on the page:

- opentable: "Creating a Qdrant Cloud cluster was one of the easiest
  parts of the project. It just worked."
- and-ai: "With Qdrant, we scaled to a billion vectors and still respond
  in sub-second latency."

Dust is left alone. Its one card follows a sentence written to introduce
it, so moving it would orphan that sentence.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Move the OpenTable lead quote to one that carries its own context

"Creating a Qdrant Cloud cluster was one of the easiest parts of the
project" was sitting above every line of prose in the article. It only
lands once you know there was a project and that it had hard parts, so as
an opener it read as a punchline with no setup. It goes back after "Third,
Qdrant Cloud provided a deployment path that was simpler than
self-hosting", which is the context it was written against.

The article already had a Lombardo quote near the top explaining why
OpenTable built Concierge at all. That one needs nothing before it, and it
already sat after the opening paragraph, so it becomes the lead card
without being moved anywhere.

A lead quote has to make sense to someone who has read only the title, and
it belongs after the opening paragraph rather than above it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Show the customer logo on every quote card

The logo used to sit only on the first card in each article, so later
quotes carried no visual marker of who was speaking beyond the name and
role. Adds it to the remaining 18 cards: 10 in Bayer, 3 each in OpenTable
and Sprinklr, 2 in &AI.

Note this hides the company name on those cards, since the component drops
it when a logo is present. The name still appears on narrow screens, where
the logo is hidden.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Convert the quotes still left in prose in &AI and Dust

Working through what find-customer-quotes.py reported rather than stopping
at the first few. &AI goes from 3 cards to 8, Dust from 1 to 4.

Where the original splits a quotation across "said Turner", the card takes
only the contiguous half that says something about Qdrant and the setup
half stays in the prose, so nothing is joined and no words change.

What is left in those two files is deliberate: the setup halves, and
Polu's remarks about LLMs and fine-tuning in general, which are context
rather than anything about Qdrant.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Drop the quote-finding script from the branch

Keeping it out of the repo. It was only ever scaffolding for this
conversion work, not something the site needs to build.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Spend the avatar and logo only on the quotes worth marking out

Putting them on every card spent them on none - the face and the logo are
what make a card read as a headline, so they only work if most cards go
without.

Bayer goes back to how it was on master: two marked out of twelve.

Each of the others keeps them on the one or two quotes making the
strongest claim:

- opentable: the lead, and "Creating a Qdrant Cloud cluster was one of the
  easiest parts of the project. It just worked."
- and-ai: the lead, and "Qdrant was the only one that handled that load
  out of the box."
- dust: "we were able to reduce our cost by 2x", the one with a number.
- sprinklr: "Retrieval is the foundation of all our AI tasks."

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Dust and Sprinklr fixes from review

Two quotes go back into the prose they came from. "The early setup worked
out of the box nicely" sits inside a numbered list item, which is the
in-bullet case that should have been left alone. "Qdrant is a very fast
and high quality retrieval system" does not say much the surrounding
benchmark numbers have not already said. Both restored exactly.

Deletes Dust-Quote.jpg, now that nothing references it, and bolds "reduce
our cost by 2x" in the quote that reports it.

Embeds the Vector Space Talk with Stanislas Polu after the paragraph
linking to it.

Adds Raghav Sonavane's photo, supplied by the team, cropped to head and
shoulders like the other avatars. It goes on the one Sprinklr quote that
carries the logo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Rejoin the &AI quotes that were split across an attribution tag

Each of these is one statement in the original, interrupted only by "said
Turner". I had put the second half in the card and left the first stranded
in the prose, so the card carried half a thought and the setup sat above it
going nowhere.

The tag goes, the comma that introduced it becomes a period, and the two
halves join. No words change - checked that both halves still appear
verbatim in the original either side of the join.

Affects five quotes: retrieval over generation, the scale benchmark, the
opinionated docs, multi-tenancy, and the billion-dollar case.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 01:35:46 +05:30
Kumar ShivenduandClaude Opus 5 eff51a142b Add a customer quote component with customer avatar and logo (#2644)
* Add a customer quote component and apply it to three case studies

Customer quotes in case studies are written four different ways -
`> "quote" - Name, Title`, italic text with an italic attribution line,
quoted sentences buried mid-paragraph, or nothing at all. None of them
produce a visually distinct, attributed quote.

The root cause is that the six existing testimonial partials all read
`.Page.Params`, so they only work on landing pages driven by data files.
A case study written in markdown has no way to reach any of them, and
there was no quote shortcode, so authors fell back to raw markdown.

Add a `quote` shortcode with a matching stylesheet. Only `text` and
`name` carry the quote; `role`, `company`, `avatar`, `logo` and
`featured` are all optional and degrade gracefully.

Apply it to one case study per broken convention:

- bayer:       attribution glued onto the end of the quoted sentence,
               where the hyphen before the name collides with the one
               inside the job title. Converts 3 of 12; the rest are a
               mechanical repeat.
- tripadvisor: quote sat at line 57 of 64. Promoted to the lead quote
               and trimmed to a contiguous excerpt, with an ellipsis
               marking the omitted middle. Moved, not duplicated.
- sprinklr:    quote buried mid-paragraph. No avatar exists for this
               speaker, which exercises the graceful degradation.

The stylesheet nests its descendants so every rule carries two classes
of specificity. The article stylesheet targets bare `blockquote`, `p`
and `figcaption` under `.qdrant-post__content`, which otherwise wins
over a single-class selector and re-applies its own card and margins.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Convert Bayer's remaining nine quotes to the quote component

Finishes the conversion started in the previous commit: all twelve quotes
in the article now use the shortcode, and no bare blockquotes remain.

All twelve come from the same speaker with an identical attribution
suffix, so this was a mechanical pass. The repeated attribution is worth
a look in review - twelve cards each carrying the same face, name, role
and Bayer logo may be heavier than it needs to be when the speaker never
changes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Slim the repeated attributions in the Bayer case study

Every quote in the article is from the same speaker, so twelve cards each
carrying the same face and Bayer logo was heavier than it needed to be.

The lead quote keeps the full treatment. The other eleven keep name and
role, which still identifies the speaker for a reader who lands partway
down the page, but drops the repeated avatar and logo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Add the Sprinklr logo to the Sprinklr quote

Fills the empty right-hand side of the card. No headshot exists for this
speaker yet, so the avatar slot stays empty until one is supplied.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Restore both customer quotes to their published wording

The Tripadvisor quote had a sentence cut out of it and replaced with an
ellipsis, and the Sprinklr quote had its trailing comma changed to a
period once it stood on its own. Neither was ours to decide. Both now
match the published text exactly.

Audited all 14 quotes on this branch against master, comparing words and
punctuation. The twelve Bayer quotes were already verbatim.

Two changes to attribution remain, since they are formatting rather than
the speaker's words, but are worth a look in review:

- Bayer's title renders as "Senior Director AI/ML, Precision Medicine &
  Insights" instead of the original hyphen, which was what collided with
  the dash before his name.
- Tripadvisor's attribution used to link to Rahul Todkar's LinkedIn. The
  component has no link support, so that link is now only in the body.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Drop the trailing comma from the Sprinklr quote

The comma joined the quotation to "explains Sonavane" in the original
sentence. Standing on its own in a block, it reads as an unfinished
sentence, so the quote ends in a period.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Restore the two attribution details lost in the conversion

Add a `name_url` param so a speaker's name can link to their profile, and
use it to restore the link to Rahul Todkar's LinkedIn that the original
Tripadvisor attribution carried.

Put back the hyphen inside Hooman Sedghamiz's job title. It was changed
to a comma because the original line ran two hyphens together - one
separating the quote from the speaker, one inside the title itself - and
they were indistinguishable. The component gives the speaker its own row,
so the first hyphen is gone and the one in the title reads clearly again.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Lift the remaining standalone Sprinklr quotes into the component

Four more were buried in prose: one closing a paragraph, one opening
another, one mid-paragraph, and one sitting as its own line. All are now
quote cards, and the logo moved to whichever card comes first on the page.

Words are verbatim. The only change is the trailing comma that joined each
quote to "says Sonavane", which belongs to our sentence rather than to the
speaker and goes with it.

Three quotes inside the "Why Qdrant?" bullet list are deliberately left
alone - lifting those would restructure the list, which is a layout call.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Put the "key challenge" quote back into the prose

It states the problem Sprinklr had, not anything about Qdrant, so on its
own in a card it reads as context-free. It did its job as the setup
sentence it was written to be. Restored exactly as published, original
comma included.

Sprinklr keeps the four quotes that stand on their own.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Reformat the benchmark code block in the Sprinklr case study

Every record was split across two lines with a blank line between them and
nothing was indented, so the block rendered as a wall of fragments. Each
record is now one indented line.

The fence was tagged json while the contents are Python - a `data = [...]`
assignment with single-quoted keys - so nothing was highlighted. Corrected
to python.

The records were parsed and re-emitted rather than retyped, and the values
were compared before and after, so the data is unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Stop repeating the company name next to its logo

A card showing the Bayer logo read "Senior Director AI/ML - Precision
Medicine & Insights, Bayer" right beside it. The logo already says which
company it is.

The name is hidden with CSS rather than dropped from the template, because
the logo is hidden below the md breakpoint and the company name has to
carry that job again on narrow screens.

Cards with no logo are unchanged and still name the company.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Give the two strongest Bayer quotes the visual weight

All twelve quotes stay as cards. The article was written with twelve pull
quotes and that structure is the author's, not ours to rewrite. What
changes is which ones carry the face and logo, and where two of them sit.

The omnimodal quote becomes the lead. It is the strongest thing in the
piece - a senior director at a 116,000 person company saying vector
databases outgrew RAG, and that "no one had" an omnimodal search engine
until this one. We could not make that claim ourselves.

The 20% efficiency quote gains the face and logo where it already sits. It
is the only quantified outcome spoken rather than reported, and a number
is worth more in the customer's voice than in ours.

The grounding quote that used to lead moves into the agents section, after
the paragraph introducing deep agents - "if you remove the search from the
agent" is what that section is about. It becomes a light card.

Also restores the blank line after seven cards that were glued to the
paragraph following them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Highlight the grounding quote instead of the 20% one

"20% efficiency" has no denominator - efficiency of what, measured how -
and it ends on "it wouldn't be possible without the components", which
does not say which components. It stays as a card, just not a highlighted
one.

The grounding quote takes the second face and logo. "If you remove the
search from the agent, the results go back to two years ago" is the most
concrete line in the piece, and it complements the lead rather than
repeating it: one says what Qdrant became, the other what breaks without
it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Set the lead quote at the same size as the others

The lead quote was 24px against 20px elsewhere, which made Tripadvisor's
long quote a wall of text. Position, the face and the logo already mark it
out. Drops the mobile override that only existed to scale the 24px back
down.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Apply the designer's type settings to the quote text

font-size 1.125rem, line-height 1.65rem, margin-bottom 1.5rem.

The margin needed the rule nested a level deeper to take effect. The
article stylesheet sets `blockquote p:last-child { margin-bottom: 0 }`,
which outranked the flat selector, so the spacing was being dropped.

Removes the narrow-screen override, which set the same 18px the designer
asked for and differed only in line-height.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-20 15:24:31 +05:30
Kumar ShivenduandClaude Opus 5 0218211790 Clarify shard_number semantics in multitenancy article (#2638)
Under custom sharding, shard_number is the number of physical shards
per shard key, not the number of shard keys. The example used
shard_number=2 alongside two create_shard_key calls, which reads as if
the value had to match the number of keys.

Set it to 1, matching the canonical create-collection/with-custom-sharding
snippet, and note what the parameter actually controls.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 16:21:40 +05:30
Kumar Shivendu 020024aea2 Merge pull request #1865 from qdrant/disable-quantization-guide
Add snippets to disable quantization in guide
2025-08-20 04:20:53 +05:30
KShivendu f7368f0df8 Add more snippets 2025-08-19 18:26:21 +05:30
KShivendu 3b60554c4f Add snippets to disable quantization in guide 2025-08-19 00:48:30 +05:30
Kumar Shivendu 18b8be4ed2 Merge pull request #1851 from qdrant/distributed-deploy-custom-shards
Add dedicated section for creating custom shards in distributed deployment guide
2025-08-13 14:44:37 +05:30
KShivendu f94c78b93a fix API ref link 2025-08-13 14:40:49 +05:30
KShivendu 95a331e803 Apply suggestions 2025-08-13 14:39:16 +05:30
KShivendu 0e9f951738 Add dedicated section for creating custom shards in distributed deployment guide 2025-08-13 14:24:07 +05:30
Kumar Shivenduandgenerall 80f2b6f978 feat: Update benchmarks (#386)
* feat: Update benchmarks

* fix: Improve blog

* feat: Add result files with 1 and 100 parallel clients

* fix: Add elasticsearch benchmark numbers from dbpedia 1M openai embeddings

* feat: Make mean time (latency) the default metric for the 2nd plot

* feat: Improve conclusions based on es results

* fix: Make charts work on changing dataset

* fix: Typo in table

* feat: Update results with quantization

* fix: Show a single graph to keep things simple

* fix: Improve words

* review fixes

* add link to open-source

* feat: Improve units to make results more readable

* fix: Small grammatical mistake

* fix: Make search threads value constant based on plot metric

* feat: Make dataset num vectors more readable

* fix: Spacing in table

* feat: Add results from the latest Redis benchmarks

* feat: Update benchmarks page

* feat: Update date and some of the points

* feat: Update benchmarks and content

* chores: Improve observations

* feat: Improve observations and put it after the graph

---------

Co-authored-by: generall <andrey@vasnetsov.com>
2024-01-11 14:11:06 +00:00