${hit.title}
${img}
${hit.description || ''}
`;
}
search.addWidgets([
instantsearch.widgets.index({ indexName: 'percona_main_site' }).addWidgets([
instantsearch.widgets.configure({ hitsPerPage: resultsPerPage }),
instantsearch.widgets.hits({ container: '#results1 .hits', templates: { item: hitTemplate } }),
instantsearch.widgets.pagination({ container: '#results1 .pagination' }),
makeStatsWidget('results1'),
])
]);
search.addWidgets([
instantsearch.widgets.index({ indexName: 'percona_docs_pages' }).addWidgets([
instantsearch.widgets.configure({ hitsPerPage: resultsPerPage }),
instantsearch.widgets.hits({ container: '#results2 .hits', templates: { item: hitTemplate } }),
instantsearch.widgets.pagination({ container: '#results2 .pagination' }),
makeStatsWidget('results2'),
])
]);
search.addWidgets([
instantsearch.widgets.index({ indexName: 'percona_blog_articles' }).addWidgets([
instantsearch.widgets.configure({ hitsPerPage: resultsPerPage }),
instantsearch.widgets.hits({ container: '#results3 .hits', templates: { item: hitTemplate } }),
instantsearch.widgets.pagination({ container: '#results3 .pagination' }),
makeStatsWidget('results3'),
])
]);
search.addWidgets([
instantsearch.widgets.index({ indexName: 'percona_community_blog_pages' }).addWidgets([
instantsearch.widgets.configure({ hitsPerPage: resultsPerPage }),
instantsearch.widgets.hits({ container: '#results4 .hits', templates: { item: hitTemplate } }),
instantsearch.widgets.pagination({ container: '#results4 .pagination' }),
makeStatsWidget('results4'),
])
]);
search.on('render', () => {
clearActive();
scheduleReposition();
// reset the "user picked a tab" pin whenever the query changes
const q = (search.helper ? search.helper.state.query : '').trim();
if (q !== lastQuery) {
lastQuery = q;
userChoseTab = false;
}
if (q !== '') maybeAutoSwitch();
});
search.start();
function getInput() {
return container.querySelector('.ais-SearchBox-input');
}
function openPopup() {
updateDropPositions();
popupEl.classList.add('open');
const input = getInput();
if (input) input.setAttribute('aria-expanded', 'true');
}
function closePopup() {
popupEl.classList.remove('open');
clearActive();
const input = getInput();
if (input) input.setAttribute('aria-expanded', 'false');
}
function setupCombobox() {
const input = getInput();
if (!input) return;
input.setAttribute('role', 'combobox');
input.setAttribute('aria-expanded', 'false');
input.setAttribute('aria-controls', 'search-popup');
input.setAttribute('aria-haspopup', 'listbox');
input.setAttribute('aria-autocomplete', 'list');
input.setAttribute('aria-label', 'Search percona.com');
}
setupCombobox();
function visibleHitLinks() {
const activePanel = popupEl.querySelector('.results.active');
return activePanel ? Array.from(activePanel.querySelectorAll('.hit-link')) : [];
}
function clearActive() {
activeIndex = -1;
popupEl.querySelectorAll('.hit-link.is-active').forEach(el => {
el.classList.remove('is-active');
el.removeAttribute('aria-selected');
});
const input = getInput();
if (input) input.removeAttribute('aria-activedescendant');
}
function setActive(index) {
const links = visibleHitLinks();
if (!links.length) return;
activeIndex = (index + links.length) % links.length;
links.forEach((el, i) => {
const on = i === activeIndex;
el.classList.toggle('is-active', on);
if (on) {
if (!el.id) el.id = 'hit-option-' + i;
el.setAttribute('aria-selected', 'true');
el.scrollIntoView({ block: 'nearest' });
const input = getInput();
if (input) input.setAttribute('aria-activedescendant', el.id);
} else {
el.removeAttribute('aria-selected');
}
});
}
document.querySelectorAll('.search-popup .tab').forEach(tab => {
tab.addEventListener('click', () => activateTab(tab, { byUser: true }));
tab.addEventListener('keydown', (e) => {
const tabsArr = Array.from(document.querySelectorAll('.search-popup .tab'));
const i = tabsArr.indexOf(tab);
let next = null;
if (e.key === 'ArrowRight') next = tabsArr[(i + 1) % tabsArr.length];
if (e.key === 'ArrowLeft') next = tabsArr[(i - 1 + tabsArr.length) % tabsArr.length];
if (next) {
e.preventDefault();
next.focus();
activateTab(next, { byUser: true });
}
});
});
function activateTab(tab, opts = {}) {
if (opts.byUser) userChoseTab = true;
document.querySelectorAll('.search-popup .tab').forEach(t => {
t.classList.remove('active');
t.setAttribute('aria-selected', 'false');
t.setAttribute('tabindex', '-1');
});
document.querySelectorAll('.search-popup .results').forEach(r => r.classList.remove('active'));
tab.classList.add('active');
tab.setAttribute('aria-selected', 'true');
tab.setAttribute('tabindex', '0');
document.getElementById(tab.dataset.target).classList.add('active');
clearActive();
}
function expandSearch() {
updateDropPositions();
container.classList.add('expanded');
const delay = isDropdownMode() ? 0 : 260;
setTimeout(() => {
// the wrap is laid out by now, so measure it for real — measuring too
// early estimated 56px and let the popup slide under the input bar,
// hiding the tab row and the first hit
updateDropPositions();
const input = getInput();
if (input) {
input.focus();
if (input.value.trim() !== '') openPopup();
}
}, delay);
}
// focusIcon: only when the user deliberately dismissed the search (close
// button, Escape, icon toggle). On an outside click focus belongs wherever
// they clicked, so don't yank it back to the header.
function collapseSearch(opts = {}) {
const { focusIcon = true } = opts;
const input = getInput();
if (input) {
input.value = '';
search.helper.setQuery('').search();
}
closePopup();
container.classList.remove('expanded');
if (focusIcon) iconBtn.focus();
}
iconBtn.addEventListener('click', () => {
if (isDropdownMode() && container.classList.contains('expanded')) {
collapseSearch();
} else {
expandSearch();
}
});
collapseBtn.addEventListener('click', collapseSearch);
container.addEventListener('keydown', (e) => {
const input = getInput();
if (!input || e.target !== input) return;
if (e.key === 'Enter') {
e.preventDefault();
const links = visibleHitLinks();
if (popupEl.classList.contains('open') && activeIndex >= 0 && links[activeIndex]) {
links[activeIndex].click();
} else {
const q = input.value.trim();
if (q !== '') goToSearchPage(q);
}
return;
}
if (!popupEl.classList.contains('open')) return;
if (e.key === 'ArrowDown') {
e.preventDefault();
setActive(activeIndex + 1);
} else if (e.key === 'ArrowUp') {
e.preventDefault();
setActive(activeIndex - 1);
} else if (e.key === 'Home' && activeIndex >= 0) {
e.preventDefault();
setActive(0);
} else if (e.key === 'End' && activeIndex >= 0) {
e.preventDefault();
setActive(visibleHitLinks().length - 1);
}
});
popupEl.addEventListener('mousemove', (e) => {
const link = e.target.closest('.hit-link');
if (!link) {
if (activeIndex !== -1) clearActive();
return;
}
const links = visibleHitLinks();
const i = links.indexOf(link);
if (i !== -1 && i !== activeIndex) setActive(i);
});
popupEl.addEventListener('mouseleave', () => {
clearActive();
});
document.addEventListener('focusin', (e) => {
if (container.contains(e.target) && e.target.matches('.ais-SearchBox-input')) {
if (e.target.value.trim() !== '') openPopup();
}
});
/* Outside-click close.
First/Prev/Last pagination controls become disabled after the refinement they
trigger, so InstantSearch swaps the clicked for a . By the time the
click reaches this listener the original node is detached and
container.contains(e.target) is false — which used to close the panel.
composedPath() is captured at dispatch time and still contains the container;
the pointerdown flag is a fallback for anything that doesn't expose it. */
let pressedInside = false;
document.addEventListener('pointerdown', (e) => {
pressedInside = container.contains(e.target);
}, true);
document.addEventListener('click', (e) => {
const path = typeof e.composedPath === 'function' ? e.composedPath() : null;
const inside = path ? path.includes(container) : container.contains(e.target);
if (inside || pressedInside) return;
// full collapse, not just closePopup() — leaving the expanded input bar
// behind puts it on top of whatever nav menu the user just opened
if (container.classList.contains('expanded')) collapseSearch({ focusIcon: false });
else closePopup();
});
// keyboard equivalent: tabbing or focusing into a nav menu also dismisses it
document.addEventListener('focusin', (e) => {
if (!container.classList.contains('expanded')) return;
if (container.contains(e.target)) return;
collapseSearch({ focusIcon: false });
});
document.addEventListener('keydown', (e) => {
if (e.key !== 'Escape') return;
if (popupEl.classList.contains('open')) {
closePopup();
const input = getInput();
if (input) input.focus();
} else if (container.classList.contains('expanded')) {
collapseSearch();
}
});
})();
Open Source Database Software & Experts
Your Database.
No License Fees.
Zero Lock-In.
The Way Is Open.
Open Source MySQL, PostgreSQL, Valkey and MongoDB®, backed by experts, 24/7, so they stay fast and reliable. No traps, no BS, just freedom to go farther.
Database Technology
Any Environment. Any Database.
No Restrictions On What Fits.

MySQL
Get enterprise features and zero licensing fees, fully open source.
MongoDB®
Escape proprietary lock-in before the costs start spiraling.
PostgreSQL
Encrypt, scale, and run PostgreSQL free of proprietary extensions.
Valkey / Redis
A founding governance seat, not just a support contract.
Database Solutions
Your Databases. At Their Best.

No ticket roulette, no juniors reading scripts. Real database engineers, at whatever level of involvement you actually need.
Expert Support
24×7 incident response, troubleshooting, and advisory guidance for MySQL, PostgreSQL, MongoDB®, Valkey/Redis, and MariaDB.
ExpertOps
Proactive, hands-on database management to keep your environments stable, tuned, monitored, and well-maintained.
Expert Consulting and Services
Project-based execution and specialized expertise for major architectural changes and deep technical problem solving.
Training
Instructor-led, hands-on training to build practical expertise in MySQL, PostgreSQL, MongoDB®, and more.
Database Services
Database Problems?
Let's Get Them Fixed.
Database Migrations
Move between databases, clouds, or versions with tested cutover and rollback plans.
Architecture and Design
Design for scale and high availability before problems get expensive.
Security Assessment
Harden access, encryption, and compliance posture across your fleet.
Database Health Audit
A full review of performance, stability, and risk, with fixes in priority order.
Performance Tuning
Find and fix the queries, configs, and bottlenecks slowing you down.
Monitoring Quickstart
Get Percona Monitoring and Management deployed, tuned, and live on your dashboards, fast.
THE WAY IS OPEN THE WAY IS OPEN THE WAY IS OPEN THE WAY IS OPEN THE WAY IS OPEN THE WAY IS OPEN
Solution Use Cases
SOLVE. INNOVATE.
BE FREE.
Cost Optimization
Cut licensing waste, reduce cloud overprovisioning, and meet price and performance goals.
Performance and Reliability at Scale
Maintain consistent performance, low latency, and high availability as workloads scale.
Security, Sovereignty, and Compliance
Transparent, verifiable database security that keeps data control, governance, and compliance in your hands.
Future-Ready Architecture (AI & Emerging Workloads)
Modernize for AI, analytics, and hybrid data workloads without replatforming, feature lock-in, or unpredictable cost models.
Reviews
What Our
Customers Say
From startups to global platforms, teams rely on Percona expertise to keep open source databases performing reliably in demanding production environments.

"Percona’s support has given us the confidence to push the boundaries of what’s possible, knowing that ourdatabases are in the best hands.”
- Stuart Alexander, LeadByte

“While we believe and rely on MongoDB® as a technology, we decided to choose Percona as we could get more control over our database strategy. We reduced our cost, got better control over our future strategy, and improved results.”
- David Jimenez Ausin, BBVA

"Percona technical support is not only crucial when it comes to saving the Trend Micro GIS team time when troubleshooting, it also enhances our DBA Linux-based database skills." - Chenhsi Li, Senior Manager, Global Infrastructure Services
- Private Cloud Team, Trend Micro

“One of our biggest goals was to have peace of mind, knowing that our databases are safe, backed up, and running smoothly, and Percona has more than delivered on that.”
- Hirad Roshandel, Property.ca Inc.

“Partnering with Percona was the best decision for our team. I would recommend Percona to anyone who needs enterprise support, whether cloud-based or on-prem.”
Diego Infiesta
IT Infrastructure Manager at Ryanair
Resources
Run Databases Better
Still running databases the hard way?
Talk to us about your stack, or download the software and start today.
No licence needed. No lock-in.
No licence needed. No lock-in.
Open source database software from experts who stand with you in production. Forever free from lock-in and other corporate BS.
© 2026 Percona All Rights Reserved
MySQL, PostgreSQL, InnoDB, MariaDB, MongoDB and Kubernetes are trademarks for their respective owners.
© 2026 Percona All Rights Reserved
