Tane H. 판매

Papermark is a self-hosted DocSend alternative for securely sharing documents via custom links, with built-in analytics, custom branding, and enterprise features like Data Rooms and advanced permissions.
Papermark is a full-stack Next.js application for secure document sharing with built-in analytics, custom branding, and access controls. It serves as a self-hosted replacement for DocSend, targeting teams that need document tracking, data rooms, and viewer-level analytics without vendor lock-in.
.agents/ - AI agent skill definitions and browser automation templates.github/ - CI/CD workflows and GitHub configurationapp/ - Next.js App Router pages and layouts (server components, API routes)components/ - Reusable React UI components including conversations, datarooms, and document viewerscontext/ - React context providers for global stateee/ - Enterprise Edition features (conversations, advanced permissions, groups)lib/ - Utility functions, Tinybird analytics, Prisma client, and third-party integrationspages/ - Next.js Pages Router API routes and legacy pagesprisma/ - Prisma schema and database migrationspublic/ - Static assetsstyles/ - Global CSS and Tailwind base stylesmiddleware.ts - Next.js middleware for auth and routingnext.config.mjs - Next.js build configurationtailwind.config.js - Tailwind CSS configurationtrigger.config.ts - Trigger.dev background job configurationtsconfig.json - TypeScript compiler optionsnpm install next react react-dom typescript
npm install @prisma/client prisma
npm install next-auth @next-auth/prisma-adapter
npm install @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner @aws-sdk/cloudfront-signer @aws-sdk/client-lambda
npm install @ai-sdk/openai @ai-sdk/google-vertex @ai-sdk/react
npm install @radix-ui/react-accordion @radix-ui/react-alert-dialog @radix-ui/react-avatar
npm install @hookform/resolvers react-hook-form zod
npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities
npm install @boxyhq/saml-jackson
npm install @chronark/zod-bird
npm install @jitsu/js
npm install @libpdf/core
npm install @pdf-lib/fontkit pdf-lib
npm install @calcom/embed-react
npm install @github/webauthn-json
npm install @next/third-parties
npm install lucide-react
npm install tailwindcss postcss autoprefixer
npm install resend stripe
격리된 샌드박스를 띄워 서버에서 바로 실행하세요 — 로컬 설정 불필요.
이 버전에 대한 Tetrees AI Review
This Next.js, React web app completed archive review with strong static results. Structure, dependency manifests, documentation, functional source, and common risk patterns were checked by the Tetrees verification pipeline; runtime phases are stated separately.
Deterministic AVCP artifact review
파이프라인 avcp-2026-08-04.1 · SHA-256 e8bdeb47b891435f…
This version-scoped review deterministically inspects the submitted archive for structure, dependencies, documentation, functional source, and common malicious or high-risk signals. Build and test phases are reported as passed only after an isolated sandbox audition. It is not a guarantee of perfect security.
검토일 2026년 8월 4일
이 제품을 AI IDE, 웹 빌더 또는 클라우드 IDE로 바로 가져오세요.
Tetrees를 호환 AI IDE에 연결해 보유 제품을 불러오고, 판매자 업로드 권한을 노출하지 않은 채 검증된 ZIP을 받으세요.
아직 리뷰가 없습니다.
토론을 불러오는 중…
No native iOS/Android build steps are required. This is a web-only Next.js project.
Clone and place source - Drop the source/ directory at your project root or merge it with an existing Next.js project. The app expects to run from the directory containing package.json.
TypeScript paths - Ensure tsconfig.json includes the @/* path alias pointing to the project root:
{
"compilerOptions": {
"baseUrl": ".",
"paths": { "@/*": ["./*"] }
}
}
Environment variables - Copy .env.example to .env and populate:
DATABASE_URL=postgresql://user:pass@host:5432/papermark
NEXTAUTH_SECRET=your-secret
NEXTAUTH_URL=http://localhost:3000
NEXT_PUBLIC_BASE_URL=http://localhost:3000
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_S3_BUCKET_NAME=...
TINYBIRD_TOKEN=...
RESEND_API_KEY=...
STRIPE_SECRET_KEY=...
STRIPE_WEBHOOK_SECRET=...
Database - Run migrations and generate Prisma client:
npx prisma generate
npx prisma migrate deploy
Tinybird analytics - From lib/tinybird/, push datasources and endpoints:
tb push datasources/*
tb push endpoints/get_*
Run dev server:
npm run dev
export function ConversationListItem(props: any): JSX.Element
Renders a single conversation entry in the dashboard conversation list. Delegates to the EE (Enterprise Edition) implementation in ee/features/conversations. Use this when building a conversations sidebar or inbox view that lists all document Q&A threads.
export function ConversationMessage(props: any): JSX.Element
Renders an individual message bubble within a conversation thread. Wraps the EE shared component. Use when displaying a full conversation view for a specific document link or dataroom, where viewer messages and host replies need to appear in sequence.
export default function DeleteGroup(props: {
dataroomId: string;
groupName: string;
groupId: string;
}): JSX.Element
Renders a destructive action card with a modal confirmation flow for permanently removing a permission group from a dataroom. Uses useDeleteGroupModal internally. Use on the group settings page to give admins a guarded path to remove access groups.
export default function DeleteDataroom(props: {
dataroomId: string;
dataroomName: string;
}): JSX.Element
Renders a danger-zone card that requires the user to type confirm delete dataroom before proceeding. Wraps useDeleteDataroomModal. Use on the dataroom settings page as the terminal destructive action.
export { PreviewExcelViewer } from "./preview-excel-viewer";
export { PreviewImageViewer } from "./preview-image-viewer";
export { PreviewPagesViewer } from "./preview-pages-viewer";
export { PreviewViewer } from "./preview-viewer";
Four viewer components for rendering document previews inline. Import from components/documents/preview-viewers. Use the appropriate viewer based on file type detected at runtime.
export { SidebarFolderTree, SidebarFolderTreeSelection, ViewFolderTree }
Three tree-view components exported from components/datarooms/folders. SidebarFolderTree renders a navigation tree, SidebarFolderTreeSelection supports selection mode, and ViewFolderTree is for public/viewer-facing folder browsing.
Display a live Q&A conversation panel alongside a shared document. Import both list and message components from the conversations barrel export.
import { ConversationListItem, ConversationMessage } from "@/components/conversations";
type Message = {
id: string;
body: string;
senderName: string;
createdAt: string;
};
type ConversationProps = {
messages: Message[];
onSelectConversation: (id: string) => void;
};
export function DocumentConversationPanel({ messages, onSelectConversation }: ConversationProps) {
return (
<aside className="w-80 border-l p-4 flex flex-col gap-2">
{messages.map((msg) => (
<ConversationListItem
key={msg.id}
message={msg}
onClick={() => onSelectConversation(msg.id)}
/>
))}
</aside>
);
}
export function ConversationThread({ messages }: { messages: Message[] }) {
return (
<div className="flex flex-col gap-3 p-4">
{messages.map((msg) => (
<ConversationMessage key={msg.id} message={msg} />
))}
</div>
);
}
Render the delete group danger zone at the bottom of a group settings page.
import DeleteGroup from "@/components/datarooms/groups/delete-group";
export default function GroupSettingsPage({
params,
}: {
params: { dataroomId: string; groupId: string };
}) {
const groupName = "Investors Q3";
return (
<div className="max-w-2xl mx-auto py-8 space-y-8">
<h1 className="text-2xl font-semibold">Group Settings</h1>
{/* ...other settings sections... */}
<DeleteGroup
dataroomId={params.dataroomId}
groupId={params.groupId}
groupName={groupName}
/>
</div>
);
}
Switch between viewer components depending on the document's MIME type or extension.
import {
PreviewExcelViewer,
PreviewImageViewer,
PreviewPagesViewer,
PreviewViewer,
} from "@/components/documents/preview-viewers";
type DocType = "pdf" | "excel" | "image" | "pages";
export function DocumentPreview({
url,
docType,
}: {
url: string;
docType: DocType;
}) {
switch (docType) {
case "excel":
return <PreviewExcelViewer url={url} />;
case "image":
return <PreviewImageViewer url={url} />;
case "pages":
return <PreviewPagesViewer url={url} />;
case "pdf":
default:
return <PreviewViewer url={url} />;
}
}
Place the dataroom delete card on the settings page with name confirmation.
import DeleteDataroom from "@/components/datarooms/settings/delete-dataroom";
export default function DataroomSettingsPage({
dataroomId,
dataroomName,
}: {
dataroomId: string;
dataroomName: string;
}) {
return (
<section className="space-y-6">
<h2 className="text-xl font-semibold">Danger Zone</h2>
<DeleteDataroom dataroomId={dataroomId} dataroomName={dataroomName} />
</section>
);
}
.agents/ - Skill definitions for AI coding agents covering browser automation, Postgres, Trigger.dev, and frontend design patterns..github/ - GitHub Actions workflows for CI testing and deployment.app/ - Next.js 14 App Router: server components, layouts, and co-located API route handlers.components/ - All client-facing React components including conversations UI, dataroom management cards, document viewers, and shadcn/ui primitives.context/ - React context providers for team, document, and viewer state shared across the component tree.ee/ - Enterprise Edition feature implementations referenced by the components/ barrel exports. Not directly imported; consumed via the re-export wrappers.lib/ - Core business logic: Prisma client singleton, Tinybird analytics helpers, S3 upload utilities, email templates, and Stripe webhook handlers.pages/ - Next.js Pages Router: legacy API routes under pages/api/ and any remaining pages not yet migrated to App Router.prisma/ - schema.prisma defining all models (User, Team, Document, Link, View, Dataroom, Group, etc.) and migration history.public/ - Static files served at the root, including favicon and OG images.styles/ - globals.css with Tailwind directives and CSS variable definitions for theming.middleware.ts - Edge middleware handling authentication redirects and custom domain routing.next.config.mjs - Image domains, redirects, headers, and environment variable exposure.trigger.config.ts - Trigger.dev configuration for background jobs (document processing, email queues).tailwind.config.js - Tailwind theme extensions, content paths, and shadcn/ui plugin setup.DATABASE_URL not set at build time - Prisma Client generation fails silently; ensure DATABASE_URL is present in CI environment variables and in .env before running npx prisma generate.@/* path alias not resolved - Components use @/ imports throughout; if your host project's tsconfig.json does not include "paths": { "@/*": ["./*"] } the entire component tree will fail to compile.components/ barrel exports - ConversationListItem and ConversationMessage delegate to ee/ paths; if you remove or stub the ee/ directory these will throw at runtime with a missing module error. Keep ee/ intact even if you don't use Enterprise features.TINYBIRD_TOKEN must have both read and write permissions; a read-only token causes silent 403s on event ingestion with no thrown error in the app.npx prisma generate after editing prisma/schema.prisma; the compiled client in node_modules/@prisma/client will be stale otherwise."use client" boundary - Several components in components/conversations/ and components/datarooms/ are marked "use client"; importing them in Server Components will cause a build error. Wrap them in a client boundary or import lazily with next/dynamic.I have dropped the Papermark source code (open-source DocSend alternative) into
my project under the `source/` directory. I also have USAGE.md at the project
root that documents the real exports and setup steps.
The upstream package is `user@example.com` (Next.js 14 full-stack app).
Please help me integrate Papermark into my existing Next.js project step by step:
1. Read USAGE.md and source/tsconfig.json to understand path aliases and
project structure.
2. Merge source/prisma/schema.prisma into my existing schema, resolving any
model name conflicts.
3. Set up the required environment variables listed in USAGE.md.
4. Wire the `@/*` path alias in my tsconfig.json to point to the source root.
5. Import and render the document preview viewers from
`source/components/documents/preview-viewers` in my document detail page,
switching on file type.
6. Add the DeleteDataroom component from
`source/components/datarooms/settings/delete-dataroom` to my dataroom
settings page.
7. Add the ConversationListItem and ConversationMessage components from
`source/components/conversations` to my document view page.
8. Ensure no Server Component imports a `"use client"` component directly;
wrap where needed with next/dynamic.
9. Run `npx prisma generate` and `npm run dev` and confirm the app starts
without errors.
Show me each file change with the full updated file content.
Papermark is licensed under the AGPLv3 license. See source/LICENSE for the full text. The upstream project is maintained by the Papermark team at https://www.papermark.com and the source is available at https://github.com/mfts/papermark.
This product’s unique contribution is clean room implementation of valuable code block into AVCP compatible standard.
전체 설치 가이드와 연동 프롬프트는 구매 후 열람할 수 있습니다.
CRM, ERP, Admin & Internal Tools
무료