From 9bcbf3b20ecd62520882cf8d3128de3dfac6fbdc Mon Sep 17 00:00:00 2001 From: Akshay Kolli Date: Sun, 21 Jun 2026 20:20:32 -0700 Subject: [PATCH] Add I Hate PDFs app pages --- app/ihatepdfs/page.tsx | 116 ++++++++++++++++++++++++ app/ihatepdfs/privacy/page.tsx | 93 +++++++++++++++++++ app/sitemap.ts | 2 + public/images/ihatepdfs/icon.png | Bin 0 -> 2017 bytes public/images/ihatepdfs/main-window.png | Bin 0 -> 44898 bytes 5 files changed, 211 insertions(+) create mode 100644 app/ihatepdfs/page.tsx create mode 100644 app/ihatepdfs/privacy/page.tsx create mode 100644 public/images/ihatepdfs/icon.png create mode 100644 public/images/ihatepdfs/main-window.png diff --git a/app/ihatepdfs/page.tsx b/app/ihatepdfs/page.tsx new file mode 100644 index 0000000..2f1533d --- /dev/null +++ b/app/ihatepdfs/page.tsx @@ -0,0 +1,116 @@ +import Image from 'next/image'; +import Link from 'next/link'; +import type { Metadata } from 'next'; +import appIcon from '@/public/images/ihatepdfs/icon.png'; +import mainWindow from '@/public/images/ihatepdfs/main-window.png'; + +export const metadata: Metadata = { + title: 'I Hate PDFs', + description: 'A native macOS PDF reader for highlighting, commenting, reviewing, and saving annotated PDFs locally on your Mac.', + alternates: { + canonical: '/ihatepdfs', + }, + openGraph: { + title: 'I Hate PDFs', + description: 'A native macOS PDF reader for highlighting, commenting, reviewing, and saving annotated PDFs locally on your Mac.', + url: '/ihatepdfs', + images: [ + { + url: '/images/ihatepdfs/main-window.png', + width: 1440, + height: 1440, + alt: 'I Hate PDFs macOS app showing a PDF with comments sidebar', + }, + ], + }, +}; + +const features = [ + 'Open local PDF files without uploading them anywhere.', + 'Highlight text, add comments, underline passages, and place free-text notes.', + 'Review annotations in a compact comments sidebar with replies, filters, and search.', + 'Save annotations back into the original PDF or export an annotated copy.', + 'Customize highlight and comment colors from the macOS Settings window.', +]; + +export default function IHatePDFsPage() { + return ( +
+
+
+
+
+ +

macOS PDF reader

+
+ +
+

+ I Hate PDFs +

+

+ A native macOS PDF reader built for local annotation, review, and saving without accounts, tracking, or cloud upload. +

+
+ +
+ + Privacy policy + + + Contact + +
+
+ +
+ I Hate PDFs showing a marked-up PDF with the comments sidebar open +
+
+ +
+

Features

+
+ {features.map((feature) => ( +

+ {feature} +

+ ))} +
+
+ +
+

Privacy

+
+

+ I Hate PDFs keeps opened PDFs on your Mac. The app does not collect analytics, use advertising, create accounts, or send your documents to a server. +

+

+ See the full{' '} + + privacy policy + + . +

+
+
+
+
+ ); +} diff --git a/app/ihatepdfs/privacy/page.tsx b/app/ihatepdfs/privacy/page.tsx new file mode 100644 index 0000000..36f23cf --- /dev/null +++ b/app/ihatepdfs/privacy/page.tsx @@ -0,0 +1,93 @@ +import Link from 'next/link'; +import type { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'I Hate PDFs Privacy Policy', + description: 'Privacy policy for I Hate PDFs, a macOS PDF reader that keeps files local and does not collect personal data.', + alternates: { + canonical: '/ihatepdfs/privacy', + }, + openGraph: { + title: 'I Hate PDFs Privacy Policy', + description: 'I Hate PDFs does not collect, store, transmit, sell, or share personal data.', + url: '/ihatepdfs/privacy', + }, +}; + +const sections = [ + { + title: 'Data Collection', + body: 'I Hate PDFs does not collect, store, transmit, sell, or share personal data.', + }, + { + title: 'PDF Files', + body: 'PDF files opened in the app stay on your Mac. Annotations and comments are saved only when you choose to save or export a PDF.', + }, + { + title: 'Analytics And Tracking', + body: 'The app does not use analytics, advertising, tracking, accounts, or third-party SDKs.', + }, + { + title: 'macOS Sharing', + body: 'If you use macOS sharing features, Apple or the selected sharing service may process the file according to their own privacy policies.', + }, +]; + +export default function IHatePDFsPrivacyPage() { + return ( +
+
+
+

I Hate PDFs

+

+ Privacy Policy +

+

+ Effective date: June 21, 2026. +

+
+ +
+
+

+ Summary +

+

+ I Hate PDFs is designed as a local macOS app. It does not collect personal data and does not upload your PDF files to a server. +

+
+ + {sections.map((section) => ( +
+

+ {section.title} +

+

+ {section.body} +

+
+ ))} + +
+

+ Contact +

+

+ Questions about this policy can be sent to{' '} + + mathabbayi@icloud.com + + . +

+
+
+ +
+ + Back to I Hate PDFs + +
+
+
+ ); +} diff --git a/app/sitemap.ts b/app/sitemap.ts index e07d243..691c6e6 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -16,6 +16,8 @@ export default function sitemap(): MetadataRoute.Sitemap { { url: 'https://akkolli.net/projects/graph-attention-topology', lastModified: new Date('2024-10-26') }, { url: 'https://akkolli.net/blog', lastModified: latestPostDate }, { url: 'https://akkolli.net/inspire-me', lastModified: new Date('2026-06-19') }, + { url: 'https://akkolli.net/ihatepdfs', lastModified: new Date('2026-06-21') }, + { url: 'https://akkolli.net/ihatepdfs/privacy', lastModified: new Date('2026-06-21') }, { url: 'https://akkolli.net/resume' }, ...blogEntries, ]; diff --git a/public/images/ihatepdfs/icon.png b/public/images/ihatepdfs/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..178997090cc66eab121c33e854695097d95d33b5 GIT binary patch literal 2017 zcmV<72Oju|P)CRTPgb#4p4|UHwpVsmnLYz~Pk#uC>aMoKhtS`XKtRzmf5@h_)m9BvUU8T7 z-%fCtg&DVn^a3SFs-emScU{~iXwt4HI3SsETgUz#n0~1v{?S4#XY*SJuo=V+!d9$QC$d5&)2y^vRqati z1>{hpn|{#g+6tS@8`CZ{3#n5k5XLzV4Cy=*DyBwPIbvJga5eU(%!f&Vjd~E&(zB4= zG_i#YwU{jmE+R+}BZ%TtDv!z%Zt6N8^`JR<7Gi-?c4$}_D!bMKLj-9D8n!@7nMI;K z4-e#)XCaX%xY*8itd*wZ$fCMP!*+I;4J_Kma#bxuPZz_AVtexvGRZVMa#h3q^E-9FvG+HJ8aMasb^wu^741 zfNs6D)@{SSU`}qvdzqnifY8s=*$UtX3WZ>Vti5$4{31ON&K1G5qLM;m(;ebAk^5&W zX0<2416lOPUzn>nD2^*^d1yP3C$FnPAqnfK!<0ZcZ@N#-d>CmaK^#5Yx(oi}7q&p* z1SsA={Y|E15XY;9!>ZF(=rFlREkr+P!W##rkPw+w%2JkS148-j=U4D9jcd`OprRua zUpcws(Xc~-1$Gf~;DwDc2|5{x=83k(QApE-5z$=e&Y_3smYFsA^T&6&{rnbYUho>E z7c-oe%0_z|+=I&@-DRA>Qb#O)k0{1*A*y z5Bgm`@VW_F0odWdR%Zx5zZcPzk~m0ncQ6WZsUrgS;ec|t*}Ji6Q~)Bo3dIF5ACLDm zv8=dlA#A1NPLdk+||9r!h z9he~n!Z{pX$VkgOuLa~fq(@6?dNw0iUxnNM;P)TGBk+i-3vj4!EJ=f z5K}0TW{nmSUl|nc5ws`{L&qz|rHl9&v z-dh2X4K8ED)7>Jcj#S{g#=?h=AAbSOH~u7oS49D%_hdWTc+=LjSCmoa2>&|s1ln!6LDq|f5`6mgV3%Wpq()A=m3f6fDt|w8)OmAiPLFvu_0QK z+d{%ANUa%ZAPJjVD2Of?e>-u(q<&xEP-N_EUh?@A?lb*a8BL_Ib% zyW>?-J>mNz^cgg|iy>8y{i34uat>=A|QjZ@+80ez&1=NB!F zJ9+!TU*ND;?szg1N>>Jm&Wb@#oJDrAJ%jIQM_iLO!B9w_43jdjklGUJ$PRN88)V-I zp@+{gi86^BK#nVg3^-I(%AnSwhuDe55IQ&t!N|S@sTx>Qux~05J(FJR0Mli-u++uV zOVX1N)Ndr)774aa(O~g53R!|CHI)=R+!z;HJ^bH>9xI0<5#+Su2M^EsqkA-vhTo6O zIXt6~HG0)Y%t2xi{9wiR2uCNQ(c9taYT`Eq!T*DVwCRT2IEra5qm_Sk*XUKpQsk^P zIvJo3z!t@;M2hcW3wpuG*%FSO%M+O#i3p)Vcz|#h7fK|{LO}K#o>waHp;KCDZ=FC# zh+D`oe-<)Dxk8MIKvEb6YAcOv?{EU%@ICO2fsB2_xa$Q^_ima60+?HzSs}YfLRY&7 z!Iiy2hTE(+6ydf}WJZQy*w6&W*+t0Ym1c$bY=^)zdjT$x#>Mjl$Qu>~XanKX;5bN) zsxBD!^jOn+ep!K`j)LCU;u@KViy0 zDVQVm6kweDe*gdg|NlolaNhs`00v1!K~w_(2W%#VG<20100000NkvXXu0mjfd&Qed literal 0 HcmV?d00001 diff --git a/public/images/ihatepdfs/main-window.png b/public/images/ihatepdfs/main-window.png new file mode 100644 index 0000000000000000000000000000000000000000..9f58703e26a8c6fceaa01dded4b34ed571b4bf14 GIT binary patch literal 44898 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