PDFLokal
Privacy
EN

PDFLokal development

Every change, newest first.

  1. Featuremaker card (Ojan + last updates) and 24-hour visitor count (#139)
  2. Testfixtures carry TrueType, not WOFF2 (stacked on #137) (#138)
  3. export: embed TrueType, not WOFF2 — edited text downloaded as dots (#137)
  4. Featureblend scan edits with paper and matched lettering
  5. stamp: a doc font pdf-lib cannot write declines rung 1 (Ganti Teks export killer) (#135)
  6. sentry fixes: stale-shell Unduh sheet, SW shell refresh (v5), OCR worker errors, page-manager drag, iOS NotReadableError filter (#136)
  7. TechnicalE2E timed out because Playwright was importing core tests and mine froze its timers
  8. editor: the bug prompt card is inert — it was swallowing taps meant for the document
  9. editor: the once-a-day "kabarin saya kalo ada bug" prompt, pointing at Ada masukan?
  10. Technicaldual-write to Turso alongside Neon, with the gate that stops a 200 meaning success
  11. turso: the rail schema, ported to libSQL and proven to go red
  12. tests: the old wing's Sentry replay finally RUNS — one unguarded debug line was keeping it untracked
  13. telemetry: the INTENT half — arm, sig_modal_open, export_intent. The rail could say "did it work", never "did anyone try"
  14. tests: the envelope pin admits visitor_id BY SHAPE, and the expiry guard stops reading its own prose
  15. replay: readable chrome, masked visitor — an unmask ALLOWLIST, not a mask switch
  16. telemetry: a persistent visitor_id, his ruling — returning users are unanswerable without one
  17. Mixpanel + Session Replay: one-month editor UX study, ends 2026-10-10
  18. tests: the ratified placeholder moved, so its pin moves WITH A DATE
  19. privasi: the screenshot paragraph, cut to a third
  20. feedback: paste a screenshot into the note, and say so in privasi
  21. chrome: tools share the header row on desktop; the tab says what it does
  22. tests: a REAL signature closes most of the gap his file was holding
  23. tests: two more instruments the pass-through blinded, both repaired
  24. seo: regenerate all 12 pages — the seal note existed ONLY on index.html
  25. Copyhis ruled words for the seal note and the materai paragraphs
  26. telemetry: doc_open carries `signed` — how big is the stamped population
  27. download sheet: say it when a download will break a meterai or a signature
  28. export: hand back the ORIGINAL bytes when nothing changed (passThroughSource)
  29. import: detect a signed / e-meterai PDF at import (core/import.js detectSigned)
  30. LICENSE: copyright holder is PT Fauzan Karya Digital
  31. footer: © PT Fauzan Karya Digital
  32. tests: the degrade spec asserts app.js survived, not that the landing is the editor
  33. tests: the two unrun browser specs measure the guards, not their own races
  34. telemetry: the rail can finally see the failure that kills the rail
  35. app: a missing element costs one control, never the whole module
  36. boot: a skewed asset set recovers itself once, instead of staying dead forever
  37. sw: a poisoned cache generation can never be re-adopted by name
  38. Fixdegraded session id is always a v4 UUID, so a crypto-less client is never silently dropped
  39. dukung: QRIS wordmark alone above the code, cut from the official lockup
  40. dukung: the QR is on screen one at every width; desktop puts the face beside the hat
  41. telemetry: failure_cause hint 'empty' names the 0-byte import
  42. import: a turned JPEG (EXIF Orientation ≠ 1) is re-encoded from the oriented bitmap, so the file matches the preview
  43. classifier: an undecodable image is `unsupported`, a refused typed array is `out-of-memory`
  44. telemetry: failure_cause — WHAT threw, as two enums, beside every failure with an error
  45. export: a glyph the PDF font cannot paint ships as an image, never as a failed export
  46. Template row: center the card row, drop the stray subtitle (#132)
  47. the Template row is measurable, and the 12 generated pages caught up
  48. draft: Template row above the tool cards — NOT RULED, NOT FOR MAIN
  49. placement tap opens a working zoom, and the editor stays above the keyboard
  50. Kelola Halaman: always show the bulk bar, disabled at zero selection
  51. desktop opens the document fitted to the window, not at 1:1
  52. Notes§6.6 — check that the watchmen are actually watching
  53. Featurewatch the RAIL's volume, because GA4's green says nothing about it
  54. Notes§6.5's flake is not container-specific, and CI just proved it
  55. Testupdate stale homepage-empty-mobile snapshot (#129)
  56. FixCI has never once passed, and here are both reasons
  57. Cleanupshare the browser PDF builder
  58. Fixmirror the local quality gate
  59. Fixown the Playwright server
  60. Testuse production clustering thresholds
  61. the hat goes on his head, and every QR code gets the QRIS mark
  62. Development PDFLokal: the work log as a drawer, and 26 cuts of copy doing no job
  63. Notesthe Ganti commit/doc-font race, and why three fixes were rejected
  64. Fixa re-edit is tappable where it PAINTS, not only where it was born
  65. Notesa RED gate in the cloud container is not a claim about main
  66. Testflush an event source that actually fires
  67. Testwait out the modal's deferred clears before drawing
  68. Testthe browser under test reaches localhost and nothing else
  69. Notesthe setup script runs BEFORE the checkout — install deps in the run
  70. Notesthe cloud maintenance routine's standing brief
  71. Technicalthe backfill tool, and reconcile the migration file with what is live
  72. Technicalmove telemetry + feedback off Supabase onto Neon
  73. Fixallow data: in connect-src — and the instrument that could see it
  74. Featureshrink the tab to 40x40 and give it all five of his channels
  75. Copyhis words on the scan sheet, and a test where a sentence used to be
  76. Featurerung S2 — tap a word on a scan and replace it
  77. Technicalcommit the engine — both blockers cleared weeks ago, nobody re-read the note
  78. Fixopen() survives missing optional chrome instead of dying
  79. Featurea bookmark tab in the editor, DM @okeojan, bottom-left
  80. Fixcrypto.randomUUID fallback, so a module-scope throw stops killing the app
  81. FixglyphPaints declines a font it cannot interrogate, instead of dying
  82. Featurean opt-in device-saved signature, and unchecking the box deletes it
  83. Notesbare `vercel` deploys, and a wrong-directory deploy SUCCEEDS
  84. Copy"Split PDF" -> "Pisah PDF" everywhere — one tool, one name
  85. FeaturePlay Store demand-validation drive ends, PLAYSTORE_CAMPAIGN=false
  86. TestPDF->images partial-failure toast gets its missing coverage
  87. FixPDF-to-images counts skipped pages instead of toasting success
  88. Copyfont-substitution witness gets his ratified words, "yang mirip" added
  89. Featurea silent font substitution now has a witness
  90. Fixa locked-with-user-password PDF gets its own toast, not "kosong atau rusak"
  91. Notesfour more localStorage keys documented, his ratified wording
  92. CopyKelola Halaman gets his ratified strings, Hapus Halaman splits from the toolbar's Hapus
  93. Notesstale comments now describe the ruled world; CLAUDE.md maps all of api/
  94. Cleanupfour inline annotation-lookup loops -> core findAnnotation
  95. Fixsentry-tunnel returns a static error, never err.message
  96. Fixfeedback.js mirrors t.js's client-SHA-wins reversal
  97. FixBuka Baru clears the page-manager thumbnail cache
  98. Fixempty re-edit commit deletes the edit, the original text returns
  99. Notessay plainly that this file is inert, instead of asserting a protection
  100. Cleanupdelete three exports nothing reaches
  101. NotesdeviceCapability feeds diagnostics, not the rendering decisions it claimed
  102. Notesdocument onDefaults, the deps key the header left out
  103. Notesmark state/navigation/utils/events as OLD WING ONLY
  104. Cleanupdrop surgery.reason's 'untrustworthy-run', which nothing could emit
  105. Cleanupdelete RANK_COUNT, whose comment promised a coupling it never had
  106. Notespropose making telemetry schema rejections visible before tightening them
  107. Notesname seo:check in the gate's stage list, which skipped it
  108. Notesreconcile the push section — INCLUDE 9a is armed
  109. Notesfinish the 2026-07-30 prune — CLAUDE.md 414 -> 200, two files extracted
  110. Fixannotations follow the page's inherited /Rotate, not just the user's
  111. Testassert accounting, not the race
  112. Featuresharpen the focused page when zoom settles
  113. FeatureAtur Halaman joins the File dropdown, and the grey notes become tooltips
  114. Testfive specs stopped proving a filename and started reading the bytes
  115. Fixfive, under one gate
  116. Featureevery page takes the width of the first NON-IMAGE page
  117. Copyhis words, ruled string by string
  118. Featurea general channel, because only edit users could speak
  119. Fixthe principles list split its own sentences in two
  120. Lookone chrome on every page, and the cards match the rig again
  121. Testassert the properties the RULING named, not just the string
  122. Fixbuild the RULED stamp — 37px on the dropzone, not 12.5px on the headline
  123. Notesthe two generator/token rules a cold session must not re-derive
  124. Technicalreproducible screenshot set for the founder pass
  125. Fixno navbar pill, kop-surat stays; guard the machine-readable head
  126. Fixtemplate the BODY, not the document — the intent hook was landing in a comment
  127. Testopen the bytes; feat(v2): restore signature paste
  128. Featuredark D2 honoured on first visit, and privasi/dukung onto tokens
  129. Featurethe token layer, and the landing on the 920 column
  130. Featuregrant WebAssembly and blob workers, so OCR can run
  131. Featurea rig that serves the REAL production CSP, so the wall can be SEEN
  132. Notesaudit the feature test suite — can each test go red?
  133. Fixtake duration samples from any full run, and stop the sweep littering
  134. Fixthe gate was starving itself, and now it says how long it took
  135. Testturn the sweep from liveness into fidelity
  136. Testsweep 154 real documents for pipeline LIVENESS, not fidelity
  137. Testgive the rev pin a test that can actually go red
  138. Testfeed our own OCR output back through our own importer
  139. Fixroute every drawText through one guarded door, not four
  140. FeatureOCR recognition + an invisible text layer writer, behind lab-ocr.html only
  141. Copyrepair the 11 places where the replacement comma joined a list
  142. Copyem-dashes out of every user-visible surface, replaced with ", "
  143. Testa generated scan corpus that walks the decline boundary
  144. Testread the wild corpus in place, and stop asserting a margin that moves with N
  145. Testre-derive space inference on clean data, and pin the margin
  146. Fixwarn while the cursor is still there, and stop advising a retry that cannot work
  147. Fixapp_version now names the build the browser is running
  148. Fixone invisible character could destroy a whole document
  149. Speedqualify text before walking the operator list, not after
  150. Fixa searchable scan is still a scan — read render mode, not "is there text"
  151. Notesthe gate's stage list mirrors CI, or the gate lies
  152. Fixmirror CI — the gate could be green while CI was red
  153. Lookem-dashes out of the UI strings — the eleven that take a comma
  154. Featurea scan is no longer a dead end — explain, then offer a route
  155. Featuremeasure the installed base, and give every event its own time
  156. Technicalgitignore the wild PDF corpus — real documents stay off the repo
  157. Fixthe live product had no error capture at all — it does now
  158. Fixstop losing writes silently, and put file-open failures on the rail
  159. Testclasses C, D, E — delivery, failure coverage, rail/GA4 parity
  160. Testclass B — no document text ever leaves on the rail
  161. Testclass A — every declared event must actually be emitted
  162. Notescorrect the file map — the docs moved on 2026-07-27, this block didn't
  163. Fixstop telling the edit-pdf page we can't do the thing we now do
  164. Testgive first render a budget it can survive a busy machine on
  165. Fixwarn that a protected PDF can't be saved, before the work is done
  166. Fixdecline the weight on a mixed-font line, keep the family
  167. Fixlearn the line's font from per-run geometry, not one blended target
  168. Testthe per-run-target fix can no longer survive its own revert
  169. Fixsurgery can say it did not clear what it was asked to
  170. Technicalremove decisions.md committed here by mistake
  171. pm: residual signal GO, cover change HELD; bank the gate's endpoint blind spot
  172. Testthe sweep now proves the tree didn't move under it
  173. Notespush authority belongs to the policy, not to anyone's word
  174. Fixcut every run of a line, not the widest one
  175. Notessplit the seats — execution moves to a head-dev session rooted here
  176. Fixgive the visual oracle an ink-delta signal it cannot round away
  177. Fixserve our own ES modules network-first — kill cross-deploy module skew
  178. Notesmaintenance pass — retire the old wing's docs, correct what went stale
  179. Featureteach the first-party rail what people come to do
  180. FeatureEdit Teks Asli — beta, the composite-stamp engine
  181. Featureinstall chip shows by default on every visit, not just returning (#126)
  182. Fixstamp app_version from the server's deploy SHA, not the client (#125)
  183. Fixclean-URL internal links so navigation works in the installed app (#124)
  184. Featurefirst-party typed content-blind telemetry rail (#123)
  185. FeaturePlay Store demand-validation vote at the download moment (#122)
  186. Featureinstallable PWA + homepage install helper (#121)
  187. Fixstop app.js crashing on SEO pages (missing #v2-loading)
  188. Notesstrip dangling private-memory citations from public CLAUDE.md
  189. Fixtelegraph the multi-file load + survive bad files
  190. Notestrim CLAUDE.md North-Star/status framing to seat pointer (../STATE.md)
  191. TechnicalPM docs migrated to project seat + skills lockfile (Great Reorg)
  192. Notesthe blackout's real root cause + retire the stale mobile-first premise
  193. Fixretract dangerous negative-keyword advice + 8 researched corrections
  194. Technicalbacklog — conversion tracking wired end-to-end (Ads can optimize a real goal)
  195. Technicalbacklog — Jul 13 ads audit + founder desk decisions executed
  196. Featuretaste lock — the generator refuses to run on unreviewed copy
  197. Fixduplicate ignoreErrors key shipped the fetch filters dead
  198. Technicalbacklog — SonarCloud autoscan ignores sonar-project.properties; exclusion must be set in the UI
  199. SEO legs: 12 crawlable pages, target-size compression, and the traffic alarm (#119)
  200. Fixnew GA4 stream (G-7J8JF8XZ1Q) — end the 5-day blackout (#118)
  201. Fixload our own Google tag (GT-5MRGDJVG) — GA4 was resolving to null (#117)
  202. Technicalbacklog — Sentry sweep #116 to Done; golden-master suite breakage to Open
  203. Fixtwo mobile Sentry crashes — armDrag orphan tile + iOS caret guard (#116)
  204. Fixguard GA4 config by hostname on dukung + privasi
  205. Technicalbacklog — desktop landing rd4+rd5 to Done
  206. Fixflat landing — paper-on-desk cut after live look (founder rd5) (#115)
  207. Featuredesktop toolbox — all 14 tools visible, width filled with content (#114)
  208. Technicalbacklog — Kelola pan-steal fix + h1 to Done
  209. FixKelola drag no longer stolen by native scroll on mobile (#113)
  210. Featureh1 = value prop — 'PDF beres dalam hitungan detik. Gratis.' (#112)
  211. Technicalbacklog — landing composition rd3 to Done
  212. Fixlanding composition — centered hero, corner stamp, paper-on-desk desktop (#111)
  213. docs/v2 status (#110)
  214. FixSentry fee8a76e — NotFoundError in Kelola drag-reorder (#109)
  215. Featurecarried-signature ghost + ketuk→pilih copy sweep (#108)
  216. Fixdrag always settles + home-confirm joins the sheet system (#107)
  217. Fixdesktop goes tool-first — single column, no marketing hero (#106)
  218. Fixdesktop text punch list — select-then-edit model, floating bars, any-color (#105)
  219. Fixlaunch punch list rd1 + desktop landing (founder findings Jul 3-4) (#104)
  220. FeatureTHE SWAP — pdflokal.id IS Editor v2 (#103)
  221. Featurethe landing IS the editor's empty state — homepage build (draf 3b) (#102)
  222. Featurethe physical-document language — stamps, stempel-press, held-paper drag (#101)
  223. Lookinherit the brand — PDFLokal red, warm stone, Plus Jakarta Sans (#100)
  224. Featuresupport card asks once per calendar day, not once per session (#99)
  225. Fixicon sizing — global button-svg safety net, share as primary (#98)
  226. Lookfounder notes — modern burst, swipe dismiss, 0.2s, SVG icons, human copy (#97)
  227. NotesUnduh sheet moved to Done (#92/#93)
  228. Notesgrowth loop shipped for v2 (#96)
  229. Featuregrowth loop — celebrate the download, then invite (share / QRIS) (#96)
  230. Fixpre-swap review findings — 2 HIGH, 2 MED, 2 LOW (#95)
  231. Testbigdoc fixture + generator (completes #94's swept-in stress spec)
  232. Featureswap-prep — analytics parity, Android back button, desktop ergonomics (#94)
  233. Fixcompress + re-pick pages left the CTA reaching for missing bytes (#93)
  234. Featurethe Unduh sheet — output pipeline (compress, images, ZIP, page pick) (#92)
  235. Fixdrag hardening — auto-scroll, stable insertion, grid row collapse (#91)
  236. NotesUnduh-sheet proposal + Jul 2 decisions (retire low-usage tools, no sidebar)
  237. FeatureFLIP page reorder (grab a real page) + File menu (add / start over) (#90)
  238. Featurecamera-first touch model + color-at-stroke-start + write-over-tipex (#89)
  239. Featurefounder phone punch list — 6 items (#88)
  240. FeatureEditor v2 — clean rebuild on the headless core (hidden beta at /editor-v2.html) (#87)
  241. Notescheck off render foundation (engine + streaming + telegraph), mark live-wiring next
  242. Featurelab — scroll telegraph (skeleton shimmer + position pill) (#86)
  243. Featurelab — render-on-settle (don't slow the user, slow the render) (#85)
  244. FeaturePhase 2 (lab) — streaming/windowed page loading (#84)
  245. FeaturePhase 1a — image-backed render engine + phone-openable lab (#83)
  246. Notespivot to vision-led foundation rebuild as the spine
  247. Noteslink the mesindev Field Notes writeups
  248. FeaturePhase 0b — PDF import adapter (bytes → Doc, lazy rasterize) (#82)
  249. FeaturePhase 0 — headless document model + operations (#81)
  250. Noteslock product vision as the north star
  251. TechnicalWave 1 conveniences (#79, #80)
  252. Featuredrop a file onto the sidebar to append pages (#80)
  253. Featurepaste an image from the clipboard into the signature flow (#79)
  254. Technicalupdate backlog + CLAUDE.md after #77/#78
  255. Fixshrink sidebar page badge, drop loud red active-page outline (#78)
  256. Fixrestore broken "Split PDF" homepage card (#77)
  257. CleanupWave 0 PR C — remove dead code, retire orphaned text modal, fix visual test (#76)
  258. FixWave 0 PR B — Sentry true-fixes (JS-4/7/8) (#75)
  259. FixWave 0 PR A — whiteout sticky revert, arrow-nudge, Ctrl+Z in sig modal (#74)
  260. Notesbacklog-flush roadmap-2 (waves 0-5), archive roadmap-1
  261. Featureredesign the Kelola Halaman (page-manager) modal (#73)
  262. Featurecontextual text format bar + click-away commit fix (#72)
  263. Fixclear top of first page from fixed toolbar on mobile
  264. Fixclear stale PDF.js doc cache on ueReset (Ganti File blank render)
  265. FeatureUI visual regression suite (#70)
  266. Fixsurvive pre-init taps — wrap 87 inline onclicks with optional chain (#69)
  267. Fixhostname allowlist on gtag config — stop polluting prod GA4 from localhost (#71)
  268. FixmutatePages() SSOT helper for atomic page-array re-key (#68)
  269. Technicaladd 3 entries from manual testing + Sentry triage
  270. Fixdefensive guards on Hapus Edit + sidebar thumbs (Sentry JS-7, JS-8) (#67)
  271. Fixmobile canvas blank-after-purge — restore from ImageData cache (#66)
  272. Fixnull-guard signature preview when no page selected (Sentry JS-6) (#65)
  273. FixGanti File now actually renders the new file (#64)
  274. Technicaladd 6 new items from manual testing + user feedback
  275. Technicalcleanup drift + spaghetti — 5 cheap wins (#63)
  276. Technicalfix ReDoS regex + drop orphan mermaid docs page
  277. Technicalbump APP_VERSION to 2026.06.02.1
  278. Technicaltrack backlog.md in repo
  279. Featureauto-switch to "Pilih" after whiteout + text actions (#60)
  280. Featuremax Sentry — breadcrumbs from track(), 10% replay, device tags (#62)
  281. Fixguard stale selectedAnnotation to stop iOS tap crash (#61)
  282. Technicalbump APP_VERSION to 2026.06.01.1
  283. Fixrename "Hapus Semua" + add confirm guard (C3) (#59)
  284. Feature"Tempel di semua halaman" checkbox in paraf modal (#56)
  285. Fixdefault modal tab to Gambar (draw), not Upload Foto (#55)
  286. Featureinline text on first creation + last-used formatting memory (#54)
  287. Cleanupbottom 3-dots becomes Lainnya menu, top 3-dots hidden (#57)
  288. FixEscape closes overlay, not the whole editor (#53)
  289. Technicalbump GitHub Actions to Node 24-compatible majors (#52)
  290. Fixtolerance-based pixel diff so CI Linux matches macOS baselines
  291. FeatureTier 2.4 — golden-master PDF tests via PNG hash
  292. Featuretunnel Sentry events through /api/sentry-tunnel
  293. Fixenable Sentry for www.pdflokal.id too — apex 301s to www
  294. FeatureTier 2 step 3 — wire Sentry browser SDK with privacy-first replay
  295. FeatureTier 1 — Playwright smoke + GH Actions + global error capture (#51)
  296. Technicalremove dead emitter channels with no subscribers
  297. Fixdrop unsafe-eval from CSP — no app or vendor code requires it
  298. Fixannotations on rotated pages now export at the correct position
  299. FixEscape cancels inline edit without kicking user home; font fetch failure no longer re-fetches per annotation
  300. FixXSS in showToast/showFullscreenLoading, harden modals and cleanup dead code
  301. Notesupdate CLAUDE.md, patterns, future-architecture for PageRenderer class
  302. Cleanupextract PageRenderer class from page-rendering.js
  303. debug: add viewport width to init console log (v2026.03.16.3)
  304. Fixenable real PDF.js Web Worker by removing preloaded script tag
  305. Notesupdate security.md CSP to match vercel.json
  306. Fixallow Google Ads conversion tracking scripts and images
  307. Technicaladd app version tag to console for cache debugging
  308. Fixaddress 3 real causes of scroll flicker from console logs
  309. Notesupdate CLAUDE.md with mobile rendering lessons and deviceCapability
  310. Fixremove all canvas eviction and snapshot complexity
  311. Fixuse <img> fallback behind canvas instead of background-image
  312. Fixsnapshot rendered pages as background-image fallback
  313. FixGPU-composite canvases, overscroll-behavior on editor
  314. Fixprevent canvas wipe on re-render, raise eviction threshold
  315. Fixhide page selection border on mobile, skip DOM class toggling
  316. Fixfix blank screen on failed PDF load, fix scroll hijacking
  317. Fixeliminate empty state flash and scroll flicker
  318. Notesupdate architecture docs, add overview diagram, add GA4 tracking
  319. Fixremove unreliable mobileState.isMobile, fix isProcessingDrop leak
  320. Fixresolve canvas rendering issues on mobile
  321. Fiximprove responsiveness and touch targets
  322. Fixresolve remaining HIGH and MEDIUM SonarQube issues
  323. Fixreplace English text with Indonesian across UI
  324. Fixadd type="module" to theme.js script tags on dukung and privasi pages
  325. Fixuse native HTML elements for accessibility (S6819, S6844, S6848)
  326. Fixresolve structural MEDIUM issues across JS files
  327. FixNumber.parseInt/isNaN/parseFloat + optional chaining (S7773, S6582)
  328. Cleanupreduce complexity in keyboard.js, pdf-export.js, canvas-events.js (S3776)
  329. Cleanupreduce complexity in page-manager.js and img-to-pdf.js (S3776)
  330. Cleanupreduce cognitive complexity in 4 files (S3776)
  331. Fixresolve 7 quick-win HIGH issues (S7768, S7761, S1186)
  332. Notesupdate CLAUDE.md for vendor/CDN changes, add system-flow doc
  333. Featureadd Vercel custom event tracking with session IDs
  334. Fixself-host pdf-encrypt-lite, remove esm.sh CDN dependency
  335. Cleanupconsolidate breakpoints to 900px, define z-index scale
  336. Fixadd missing labels, aria-labels, roles, keyboard handlers
  337. Speedlazy-load editor modules for instant dropzone interactivity
  338. Fixanti-pattern audit batches 1-5 — bugs, validation, SSOT, DRY, leaks
  339. Technicalfix all 13 ESLint warnings (0 errors, 0 warnings)
  340. Featureadd event emitter (pub/sub) for reactive state sync
  341. Featureadd "Hubungi Kami" feedback form + redesign footer
  342. Notesupdate CLAUDE.md file structure for split modules
  343. Cleanupsplit 3 large files into focused modules
  344. Fixresponsive polish — icon-only buttons on mobile, full-width layout
  345. Fixclamp canvas DPR to prevent render failure at 200% browser zoom
  346. Featureadd ESLint + GitHub Actions CI, fix lint errors
  347. CleanupSSOT operation wrappers for annotations and page reorder
  348. Featureadd Google Ads tag (gtag.js) across all pages
  349. CleanupDRY helpers + unified undo/redo stack
  350. Notesfix stale references in CLAUDE.md and MEMORY.md
  351. Notesadd WHY comments and SSOT markers across 12 core modules
  352. FixGabungkan modal desync, rotated thumbnails, and thumbnail resolution
  353. Fixclean up zoom keyboard shortcuts from PR #50
  354. Technicaladd .gitattributes to enforce LF line endings (Windows → Mac migration)
  355. Notescapture architectural strengths and future improvement plans
  356. Featurekeyboard shortcuts for zoom (+/- keys)
  357. Fixdeleted pages included in download, annotation position mismatch on mobile
  358. Notesadd open source infrastructure (CONTRIBUTING, CODE_OF_CONDUCT, issue/PR templates)
  359. Notesupdate architecture, editor-redesign, security, and patterns docs
  360. Notesupdate CLAUDE.md with new SSOT helpers (annotation factories, modal helpers, file type checks, loadPdfDocument)
  361. Cleanupcentralize annotation factories, modal helpers, file type checks, and PDF loading (SSOT)
  362. Notesupdate CLAUDE.md with SSOT helpers and architecture reference
  363. Cleanupcentralize scattered patterns into SSOT helpers
  364. Fixrestore thumbCanvas on undo/redo, clear paraf state on reset/tool-switch
  365. Fixpre-render thumbnail canvases during file load for instant sidebar previews
  366. Fixrepair lazy rendering drawImage crashes in thumbnails
  367. Featureadd Paraf (initials) tool with apply-to-all-pages
  368. Notesupdate CLAUDE.md with accessibility, performance, and mobile UX patterns
  369. Fiximprove accessibility, performance, and mobile UX across editor
  370. Notesupdate CLAUDE.md with Feb 2026 cleanup changes
  371. Cleanupremove ~2000 lines of dead code, duplication, and magic numbers
  372. Notesadd hardening patterns to CLAUDE.md
  373. Fixharden against race conditions, memory leaks, and state corruption
  374. Featureredesign UI with compact header, floating toolbar, and bottom bar
  375. Revert "feat(editor): sticky toolbar via full-viewport fixed positioning"
  376. Featuresticky toolbar via full-viewport fixed positioning
  377. Fixfix Ganti File not loading replacement files
  378. Featurereplace header with File dropdown menu and dynamic width
  379. Notesadd context comments for window.* calls and typeof patterns
  380. Cleanupmigrate app.js to ES modules with single entry point (Phase 5)
  381. Cleanupsplit unified-editor.js into 14 focused ES modules (Phase 4)
  382. Cleanupsplit pdf-tools.js into 7 focused ES modules (Phase 3)
  383. Cleanupconvert changelog, theme, image-tools to ES modules (Phase 2)
  384. Cleanupextract shared foundations to ES modules (Phase 0+1)
  385. Fiximprove vertical screen real estate
  386. Featurecontinuous vertical scroll with multi-canvas architecture
  387. Cleanupextract canvas utilities and DRY font map (Phase 1)
  388. Dedup helpers and add codebase documentation for safe future editing
  389. support mobile double-click (e.g. for text and signature) (#34)
  390. Add security headers, CSP, and privacy policy
  391. Add offline mode documentation and changelog entry
  392. Fix PDF.js offline worker loading
  393. Self-host core libraries for offline support
  394. Update logo images for SEO and sharability
  395. Add dark mode
  396. Add clickable GitHub link to @hamdi1611 in changelog
  397. Update changelog with real user-facing improvements (Jan 4-12)
  398. Fix: only show badge for new content, never auto-expand
  399. Fix: badge stays hidden after user closes it
  400. Implement smart changelog display based on content updates
  401. Hide changelog badge when leaving home-view
  402. Improve changelog badge: use red checkmark icon
  403. Fix: prevent locked signature toast spam
  404. Optimize PDF download: skip re-encoding for unmodified PDFs
  405. Optimize PDF file size: add compression and signature image optimization
  406. Fix signature upload bug: resolve modal transition and history issues
  407. Fix signature background removal modal not opening
  408. Add more debug logging to trace modal visibility issue
  409. Add debug logging to trace signature upload issue
  410. Fix signature upload bug caused by DOMContentLoaded race condition
  411. NotesUpdate README with recent improvements and architecture
  412. FeatureImprove signature UX with unlock and delete features
  413. Refactor changelog system: smooth notification with better UX
  414. Add debug logging for signature upload (temporary)
  415. Further split app.js: Extract Image Tools and PDF Tools + Organize into js/ folder
  416. Split app.js: Extract Unified Editor to separate file
  417. Add changelog popup notification system
  418. Fix standard font names to match pdf-lib StandardFonts enum
  419. Fix font undefined error in PDF export
  420. Fix renderEditPage null canvas error in Unified Editor
  421. Fix signature modal bug and reduce console logging
  422. Fix font rendering in editor and add debug logging
  423. Self-host fonts for offline support and restricted networks
  424. Update README.md
  425. Delete Emojis on Readme
  426. Update Readme
  427. Update LICENSE
  428. Update LICENSE
  429. edit margin and alignment
  430. edit dukung.html
  431. Update app.js
  432. Fix PDF password protection with encryption library
  433. loading screen and file output name
  434. Add features on the text Tools
  435. Remove .claude directory and CLAUDE.md from repository
  436. Update app.js
  437. Revert "Delete .claude directory"
  438. Revert "Delete CLAUDE.md"
  439. Update app.js
  440. Delete .claude directory
  441. Delete CLAUDE.md
  442. add .gitignore to keep claude files local
  443. Create settings.local.json
  444. Update app.js
  445. Update app.js
  446. Update app.js
  447. Update app.js
  448. Polishing
  449. Add files via upload
  450. Rename Logo.png to logo.png
  451. Add files via upload
  452. Add files via upload
  453. Add files via upload
  454. Delete CLAUDE.md
  455. Add files via upload
  456. Add files via upload
  457. Ojanlubis mobile branch (#27)
  458. Add files via upload (#26)
  459. Add files via upload
  460. Add files via upload
  461. Add files via upload
  462. Add files via upload
  463. Add files via upload
  464. Add files via upload
  465. Delete CLAUDE.MD (#25)
  466. Add files via upload
  467. Add files via upload
  468. Polish unified editor features and UX improvements
  469. Update CLAUDE.MD with current features and architecture
  470. Add files via upload
  471. Add files via upload
  472. Fix editor container size constraints
  473. Update style.css
  474. Update style.css
  475. Add width-based canvas scaling with zoom controls
  476. Fix layout containment while keeping canvas wrapper flexible
  477. Fix PDF wrapper vertical height adaptation
  478. Fix unified editor canvas size - maximize PDF display area
  479. Remove max-height/max-width constraints from canvas element
  480. Fix desktop canvas sizing with viewport fallback
  481. Fix PDF canvas sizing - proper flex layout and dimension calculation
  482. Fix PDF editor canvas layout and add collapsible sidebar
  483. Maximize unified editor space - reduce padding, wider sidebar (280px), tighter layout
  484. Enlarge unified editor layout - wider sidebar, larger thumbnails, more PPT-like feel
  485. Fix unified editor layout - use flex column for proper action-bar positioning
  486. Fix unified editor layout height to prevent action-bar overlap
  487. Add unified editor workspace combining page manager and PDF editor
  488. Fix signature not displaying visually in PDF editor
  489. Delete SIGNATURE_BUG_DIAGNOSIS.md
  490. Add comprehensive diagnosis of signature placement bug
  491. Fix signature placement not working after drawing/uploading
  492. Add 'Upload Gambar' option to PDF editor signature tool
  493. Add comprehensive CLAUDE.MD documentation for AI assistance
  494. Add 'Hapus Latar Belakang' (Remove Background) image tool
  495. Update README.md
  496. Delete CNAME
  497. Create CNAME
  498. Update dukung.html
  499. Update README.md
  500. Update README.md
  501. Update README with new links and information
  502. Enable Vercel Web Analytics in your project
  503. Update donation page from QRIS to bank transfer
  504. Update index.html
  505. Update index.html
  506. Add watermark, page numbering, and drop hints to PDF tools
  507. Add undo/redo to Page Manager and improve filename output format
  508. Fix drag flipping bug in PDF editor
  509. Completely redesign PDF editor with major improvements
  510. Add drag-and-drop visual indicator and edge placement
  511. Optimize Page Manager to avoid re-rendering on every action
  512. Fix bug: route dropped PDFs to Page Manager instead of removed tools
  513. Add unified Page Manager to consolidate 4 tools into 1
  514. Fix multiple bugs in PDFLokal application
  515. Add files via upload
  516. Delete files.zip
  517. Add files via upload
  518. Initial commit