מה זה
Click PDF הוא סוויטת כלים ל-PDF שעובדת כולה בצד הלקוח: העלאה, עריכה, מיזוג, פיצול, סיבוב, חיתוך, מחיקת עמודים, מספור, סימני מים, חתימה ויזואלית ועוד. יש בו 28 פעולות עורך, שרובן רצות לגמרי בדפדפן דרך pdf-lib ו-pdf.js.
הממשק כולו בעברית RTL, mobile-first, ומכוון לרמת החלקות של smallpdf. האתר בנוי מ-27 עמודי HTML בלי שלב build - vanilla HTML/CSS/JS.
הבעיה
רוב כלי ה-PDF ברשת מעלים את הקובץ לשרת זר. זו בעיית פרטיות, וגם אין דרך אמיתית להוכיח אחר כך שהקובץ שיצא הוא בדיוק מה שנחתם ולא שונה בדרך.
רציתי כלי שהעיבוד בו נשאר על המכשיר, ושמאפשר לחתום על מסמך בצורה שכל אחד יכול לאמת - בלי לסמוך על שרת.
מה בניתי
עורך PDF מלא שרץ בדפדפן, שבו כל פעולה - כולל סיבוב, מחיקת עמודים, שינוי סדר וחתימות שהונחו - נאפית לתוך הקובץ הסופי שנשמר או נחתם. השקעתי הרבה בכך שאף פעולה לא 'תיעלם בשקט' בזמן שמירה.
מעליו בניתי את SEAL: שכבת חתימה דיגיטלית. חותמים על קובץ עם keccak256 והתחייבות EIP-712 חתומה ב-secp256k1 (דרך MetaMask אם יש ארנק, אחרת מפתח fallback מקומי), ומקבלים קובץ .seal.json + QR. עמוד האימות מחשב מחדש את ה-hash ומשחזר את החותם, ומחזיר פסק דין: 'אותנטי' או 'אימות נכשל'.
איך זה עובד
הפרונטאנד הסטטי מתארח ב-Vercel ומגיש CSP קשיח בלי inline scripts. כל ספריות ה-PDF וה-crypto מתארחות אצלי (self-hosted) עם SRI - אין שום host צד-שלישי לסקריפטים.
בשרת יש Cloudflare Worker שמטפל ב-signup/login/me/contact/convert ובהורדות חתומות, מעל D1 (משתמשים, sessions, הודעות), KV ל-rate limiting, R2 ו-Turnstile. יש גם anti-clone gate בקצה, עם allowlist שמאפשר לקראולרים של חיפוש ורשתות חברתיות לקבל את העמוד האמיתי.
הסטאק
Vanilla HTML/CSS/JS בלי bundler, pdf-lib ו-pdf.js לעיבוד ה-PDF, ethers עם EIP-712 ל-SEAL. Cloudflare Workers + D1 + KV + R2 + Turnstile בצד השרת, פריסה על Vercel.
החתימה על שרשרת (phase-1b) בנויה כשלד מלא ב-Foundry עם חוזה SealRegistry.sol שעבר audit אדוורסרי, ומחכה רק לחיבור ארנק/RPC/gas כדי לעלות.
התוצאה
המערכת חיה ב-click-pdf.vercel.app ואומתה מקצה לקצה בדפדפן אמיתי: טעינת PDF, הנחת אנוטציה, שמירה עם העריכה אפויה בפנים, ומחזור SEAL מלא - חתימה, ואז אימות שמחזיר 'אותנטי' על הקובץ הנכון ו'אימות נכשל' על עותק ששונה.
מה שנשאר בהמתנה הוא dressing תפעולי בלבד: מפתח CloudConvert להמרות Office, Stripe, שליחת מייל ודומיין ייעודי. הליבה - עריכה וחתימה - עובדת.