diff --git a/apps/web/src/app/(share)/q/[token]/document-download-button.tsx b/apps/web/src/app/(share)/q/[token]/document-download-button.tsx
new file mode 100644
index 000000000..d45c21f02
--- /dev/null
+++ b/apps/web/src/app/(share)/q/[token]/document-download-button.tsx
@@ -0,0 +1,44 @@
+'use client';
+
+import { Trans, msg } from '@lingui/macro';
+import { useLingui } from '@lingui/react';
+import { Download } from 'lucide-react';
+
+import { downloadPDF } from '@documenso/lib/client-only/download-pdf';
+import type { Document, DocumentData } from '@documenso/prisma/client';
+import { Button } from '@documenso/ui/primitives/button';
+import { useToast } from '@documenso/ui/primitives/use-toast';
+
+export type DocumentDownloadButtonProps = {
+ document: Document & {
+ documentData: DocumentData;
+ };
+};
+
+export const DocumentDownloadButton = ({ document }: DocumentDownloadButtonProps) => {
+ const { toast } = useToast();
+ const { _ } = useLingui();
+
+ const onDownloadClick = async () => {
+ try {
+ if (!document) {
+ throw new Error('No document available');
+ }
+
+ await downloadPDF({ documentData: document.documentData, fileName: document.title });
+ } catch (err) {
+ toast({
+ title: _(msg`Something went wrong`),
+ description: _(msg`An error occurred while downloading your document.`),
+ variant: 'destructive',
+ });
+ }
+ };
+
+ return (
+
+ );
+};
diff --git a/apps/web/src/app/(share)/q/[token]/layout.tsx b/apps/web/src/app/(share)/q/[token]/layout.tsx
new file mode 100644
index 000000000..33b6d2bf0
--- /dev/null
+++ b/apps/web/src/app/(share)/q/[token]/layout.tsx
@@ -0,0 +1,35 @@
+import React from 'react';
+
+import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server';
+import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
+import type { TGetTeamsResponse } from '@documenso/lib/server-only/team/get-teams';
+import { getTeams } from '@documenso/lib/server-only/team/get-teams';
+
+import { Header as AuthenticatedHeader } from '~/components/(dashboard)/layout/header';
+import { NextAuthProvider } from '~/providers/next-auth';
+
+export type SigningLayoutProps = {
+ children: React.ReactNode;
+};
+
+export default async function SigningLayout({ children }: SigningLayoutProps) {
+ await setupI18nSSR();
+
+ const { user, session } = await getServerComponentSession();
+
+ let teams: TGetTeamsResponse = [];
+
+ if (user && session) {
+ teams = await getTeams({ userId: user.id });
+ }
+
+ return (
+
+ Download the document as a PDF file. +
+ +