Add I Hate PDFs app pages
All checks were successful
Deploy Website / build-and-deploy (push) Successful in 26s
All checks were successful
Deploy Website / build-and-deploy (push) Successful in 26s
This commit is contained in:
116
app/ihatepdfs/page.tsx
Normal file
116
app/ihatepdfs/page.tsx
Normal file
@@ -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 (
|
||||
<div className="page-frame py-20 sm:py-24">
|
||||
<div className="mx-auto max-w-[72rem] space-y-12">
|
||||
<header className="grid gap-8 border-b border-line pb-12 lg:grid-cols-[minmax(0,1fr)_30rem] lg:items-center">
|
||||
<div className="space-y-6">
|
||||
<div className="flex items-center gap-3">
|
||||
<Image
|
||||
src={appIcon}
|
||||
alt=""
|
||||
width={50}
|
||||
height={50}
|
||||
className="h-12 w-12 rounded-xl border border-line bg-paper-strong"
|
||||
priority
|
||||
/>
|
||||
<p className="eyebrow">macOS PDF reader</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-4">
|
||||
<h1 className="max-w-[37rem] text-balance font-sans text-5xl font-medium leading-[0.96] text-ink sm:text-6xl lg:text-7xl">
|
||||
I Hate PDFs
|
||||
</h1>
|
||||
<p className="max-w-[36rem] text-[1.04rem] leading-8 text-muted sm:text-[1.1rem]">
|
||||
A native macOS PDF reader built for local annotation, review, and saving without accounts, tracking, or cloud upload.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap gap-x-6 gap-y-3 text-[0.96rem] text-ink">
|
||||
<Link href="/ihatepdfs/privacy" className="transition-colors hover:text-accent">
|
||||
Privacy policy
|
||||
</Link>
|
||||
<a href="mailto:mathabbayi@icloud.com" className="transition-colors hover:text-accent">
|
||||
Contact
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="relative overflow-hidden rounded-md border border-line bg-paper-strong">
|
||||
<Image
|
||||
src={mainWindow}
|
||||
alt="I Hate PDFs showing a marked-up PDF with the comments sidebar open"
|
||||
sizes="(max-width: 1024px) 100vw, 30rem"
|
||||
className="h-auto w-full"
|
||||
priority
|
||||
/>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section className="grid gap-4 border-b border-line pb-10 lg:grid-cols-[9rem_minmax(0,1fr)]">
|
||||
<p className="eyebrow lg:pt-1">Features</p>
|
||||
<div className="grid gap-4 sm:grid-cols-2">
|
||||
{features.map((feature) => (
|
||||
<p
|
||||
key={feature}
|
||||
className="rounded-md border border-line bg-paper-strong p-4 text-[0.96rem] leading-7 text-muted"
|
||||
>
|
||||
{feature}
|
||||
</p>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="grid gap-4 lg:grid-cols-[9rem_minmax(0,1fr)]">
|
||||
<p className="eyebrow lg:pt-1">Privacy</p>
|
||||
<div className="max-w-[42rem] space-y-4 text-[1rem] leading-8 text-muted">
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
<p>
|
||||
See the full{' '}
|
||||
<Link href="/ihatepdfs/privacy" className="font-medium text-ink underline decoration-line-strong underline-offset-4 transition-colors hover:text-accent hover:decoration-accent">
|
||||
privacy policy
|
||||
</Link>
|
||||
.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
93
app/ihatepdfs/privacy/page.tsx
Normal file
93
app/ihatepdfs/privacy/page.tsx
Normal file
@@ -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 (
|
||||
<div className="page-frame py-20 sm:py-24">
|
||||
<article className="mx-auto max-w-[54rem] space-y-10">
|
||||
<header className="space-y-4 border-b border-line pb-10">
|
||||
<p className="eyebrow">I Hate PDFs</p>
|
||||
<h1 className="max-w-[38rem] text-balance font-sans text-5xl font-medium leading-[0.96] text-ink sm:text-6xl">
|
||||
Privacy Policy
|
||||
</h1>
|
||||
<p className="max-w-[36rem] text-[1rem] leading-8 text-muted">
|
||||
Effective date: June 21, 2026.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div className="space-y-8">
|
||||
<section className="space-y-3">
|
||||
<h2 className="font-sans text-[1.6rem] font-medium leading-tight text-ink">
|
||||
Summary
|
||||
</h2>
|
||||
<p className="text-[1rem] leading-8 text-muted">
|
||||
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.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
{sections.map((section) => (
|
||||
<section key={section.title} className="grid gap-3 border-t border-line pt-6 sm:grid-cols-[12rem_minmax(0,1fr)]">
|
||||
<h2 className="font-sans text-[1rem] font-medium text-ink">
|
||||
{section.title}
|
||||
</h2>
|
||||
<p className="text-[1rem] leading-8 text-muted">
|
||||
{section.body}
|
||||
</p>
|
||||
</section>
|
||||
))}
|
||||
|
||||
<section className="grid gap-3 border-t border-line pt-6 sm:grid-cols-[12rem_minmax(0,1fr)]">
|
||||
<h2 className="font-sans text-[1rem] font-medium text-ink">
|
||||
Contact
|
||||
</h2>
|
||||
<p className="text-[1rem] leading-8 text-muted">
|
||||
Questions about this policy can be sent to{' '}
|
||||
<a href="mailto:mathabbayi@icloud.com" className="font-medium text-ink underline decoration-line-strong underline-offset-4 transition-colors hover:text-accent hover:decoration-accent">
|
||||
mathabbayi@icloud.com
|
||||
</a>
|
||||
.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<footer className="border-t border-line pt-8">
|
||||
<Link href="/ihatepdfs" className="text-[0.96rem] font-medium text-ink transition-colors hover:text-accent">
|
||||
Back to I Hate PDFs
|
||||
</Link>
|
||||
</footer>
|
||||
</article>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -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,
|
||||
];
|
||||
|
||||
BIN
public/images/ihatepdfs/icon.png
Normal file
BIN
public/images/ihatepdfs/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/images/ihatepdfs/main-window.png
Normal file
BIN
public/images/ihatepdfs/main-window.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
Reference in New Issue
Block a user