Feedback widget for VitePress
PushFeedback collects user feedback directly from your website. This guide covers installation in a VitePress project.
Prerequisites
Before you begin, you need:
- A PushFeedback account. If you don't have one, sign up for free.
- A project created in your PushFeedback dashboard. If you haven't created one yet, follow the steps in the Quickstart guide.
- A VitePress site and Node.js installed.
Installation
Floating button

-
Install PushFeedback:
npm install pushfeedbackinfoIf you're using yarn as your package manager, run
yarn add pushfeedbackinstead of the npm command above. -
Create a custom layout component. In your
.vitepress/themedirectory, create a file namedLayout.vue:<script setup>import { onMounted } from 'vue';import DefaultTheme from 'vitepress/theme';import 'pushfeedback/dist/pushfeedback/pushfeedback.css';const { Layout } = DefaultTheme;onMounted(async () => {if (typeof window !== 'undefined') {const { defineCustomElements } = await import('pushfeedback/loader');defineCustomElements(window);}});</script><template><Layout><template #layout-bottom><feedback-buttonproject="<YOUR_PROJECT_ID>"button-position="bottom-right"modal-position="bottom-right"button-style="dark">Feedback</feedback-button></template></Layout></template>Replace
<YOUR_PROJECT_ID>with your project's ID from the PushFeedback dashboard. -
Create or update your theme's index file at
.vitepress/theme/index.js(or.ts):import DefaultTheme from 'vitepress/theme';import Layout from './Layout.vue';export default {extends: DefaultTheme,Layout: Layout}; -
Start your VitePress project by running
npm run docs:devin your terminal. Once it compiles successfully, verify that the feedback button appears and functions correctly on your site.
Inline button

Install pushfeedback if it is not already in your project:
npm install pushfeedback
Create .vitepress/theme/InlineFeedback.vue with the stylesheet, loader, and widget:
<script setup>
import { onMounted } from 'vue';
import 'pushfeedback/dist/pushfeedback/pushfeedback.css';
onMounted(async () => {
const { defineCustomElements } = await import('pushfeedback/loader');
defineCustomElements(window);
});
</script>
<template>
<feedback-button project="<YOUR_PROJECT_ID>" button-position="default" modal-position="center" button-style="dark">Feedback</feedback-button>
</template>
Render InlineFeedback where you want it in the page content.
Embedded form

Install pushfeedback if it is not already in your project:
npm install pushfeedback
Create .vitepress/theme/EmbeddedFeedback.vue with the stylesheet, loader, and widget:
<script setup>
import { onMounted } from 'vue';
import 'pushfeedback/dist/pushfeedback/pushfeedback.css';
onMounted(async () => {
const { defineCustomElements } = await import('pushfeedback/loader');
defineCustomElements(window);
});
</script>
<template>
<feedback-modal project="<YOUR_PROJECT_ID>" embedded="true"></feedback-modal>
</template>
Render EmbeddedFeedback where you want it in the page content.
Like and dislike buttons
![]()
Install pushfeedback if it is not already in your project:
npm install pushfeedback
Create .vitepress/theme/FeedbackThumbs.vue with the stylesheet, loader, and widget:
<script setup>
import { onMounted } from 'vue';
import 'pushfeedback/dist/pushfeedback/pushfeedback.css';
onMounted(async () => {
const { defineCustomElements } = await import('pushfeedback/loader');
defineCustomElements(window);
});
</script>
<template>
<div>
<p>Was this helpful?</p>
<div class="pushfeedback-thumbs-row">
<feedback-button project="<YOUR_PROJECT_ID>" rating="1" button-position="default" modal-position="center" button-style="default" custom-font="true">
<span class="pushfeedback-thumb-label">Helpful</span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3" /></svg>
</feedback-button>
<feedback-button project="<YOUR_PROJECT_ID>" rating="0" button-position="default" modal-position="center" button-style="default" custom-font="true">
<span class="pushfeedback-thumb-label">Not helpful</span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17" /></svg>
</feedback-button>
</div>
</div>
</template>
Render FeedbackThumbs after the article content.
Next steps
Choose what to do next:
- Customization — Adjust the widget's layout, styles, and text.
- Integrations — Forward feedback to Slack, email, Jira, and more.