Skip to content

Commit 59ee58e

Browse files
committed
feat: update TODO checklist, enhance download section with SHA256 checksums, and add new features to documentation
1 parent fd2238e commit 59ee58e

7 files changed

Lines changed: 643 additions & 12 deletions

File tree

TODO.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@
2929
- [x] Hero section with value proposition
3030
- [x] Feature highlights
3131
- [x] How it works (3-step flow)
32-
- [ ] Social proof / testimonials placeholder
32+
- [x] Social proof / testimonials placeholder
3333
- [x] CTA buttons (Download, Try Now)
3434

3535
- [x] **Features Page**
3636
- [x] Screen sharing capabilities
3737
- [x] Remote control features
38-
- [ ] Screen recording (local)
39-
- [ ] Text chat integration
38+
- [x] Screen recording (local)
39+
- [x] Text chat integration
4040
- [x] Security highlights
4141

4242
- [x] **Download Page**
@@ -45,7 +45,7 @@
4545
- [x] Windows: WinGet command
4646
- [x] Linux: apt/dnf/AUR commands
4747
- [x] Direct download links (GitHub Releases)
48-
- [ ] SHA256 checksums display
48+
- [x] SHA256 checksums display
4949

5050
- [x] **Pricing Page** (placeholder)
5151
- [x] Free tier details
@@ -173,6 +173,7 @@
173173
### Session Management
174174
- [ ] **Host Controls**
175175
- [ ] Start new session
176+
- [ ] P2P vs SFU mode selection at session start
176177
- [ ] Generate shareable link
177178
- [ ] Copy link to clipboard
178179
- [ ] View participant list
@@ -280,6 +281,12 @@
280281
- [ ] APT repository
281282
- [ ] AUR PKGBUILD
282283

284+
- [ ] **Shell Installers**
285+
- [ ] Unix installer script (install.sh)
286+
- [ ] Windows installer script (install.ps1)
287+
- [ ] Host at install.pairux.sh
288+
- [ ] Cloudflare Workers routing
289+
283290
- [ ] **Release Automation**
284291
- [ ] GitHub Releases
285292
- [ ] Changelog generation

apps/web/src/app/download/download-section.tsx

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,22 @@ import {
1010
Copy,
1111
Check,
1212
ExternalLink,
13+
ChevronDown,
14+
Shield,
1315
} from 'lucide-react';
1416
import { detectOS, type OS, type Arch } from '@/lib/utils';
1517

1618
const VERSION = '0.1.0';
1719

20+
// Placeholder checksums - will be generated during release build
21+
const CHECKSUMS: Record<string, string> = {
22+
[`PairUX-${VERSION}-arm64.dmg`]: 'sha256-placeholder-arm64-dmg',
23+
[`PairUX-${VERSION}-x64.dmg`]: 'sha256-placeholder-x64-dmg',
24+
[`PairUX-${VERSION}-arm64.msi`]: 'sha256-placeholder-arm64-msi',
25+
[`PairUX-${VERSION}-x64.msi`]: 'sha256-placeholder-x64-msi',
26+
[`PairUX-${VERSION}-x86_64.AppImage`]: 'sha256-placeholder-appimage',
27+
};
28+
1829
interface DownloadOption {
1930
command?: string;
2031
directUrl?: string;
@@ -147,6 +158,7 @@ function getPlatformInfo(os: OS, arch: Arch): PlatformInfo {
147158

148159
export function DownloadSection() {
149160
const [detected, setDetected] = useState<{ os: OS; arch: Arch } | null>(null);
161+
const [showChecksums, setShowChecksums] = useState(false);
150162

151163
useEffect(() => {
152164
setDetected(detectOS());
@@ -379,6 +391,54 @@ export function DownloadSection() {
379391
<ExternalLink className="h-4 w-4" />
380392
</Link>
381393
</div>
394+
395+
{/* SHA256 Checksums */}
396+
<div className="mt-12 border-t border-gray-200 pt-8">
397+
<button
398+
onClick={() => { setShowChecksums(!showChecksums); }}
399+
className="mx-auto flex items-center gap-2 text-sm text-gray-600 hover:text-gray-900"
400+
>
401+
<Shield className="h-4 w-4" />
402+
<span>Verify downloads (SHA256 checksums)</span>
403+
<ChevronDown className={`h-4 w-4 transition-transform ${showChecksums ? 'rotate-180' : ''}`} />
404+
</button>
405+
406+
{showChecksums && (
407+
<div className="mt-6 mx-auto max-w-2xl">
408+
<p className="mb-4 text-center text-sm text-gray-600">
409+
Verify your download by comparing the SHA256 checksum.
410+
</p>
411+
<div className="rounded-lg border border-gray-200 bg-gray-50 p-4">
412+
<table className="w-full text-sm">
413+
<thead>
414+
<tr className="border-b border-gray-200">
415+
<th className="pb-2 text-left font-medium text-gray-700">File</th>
416+
<th className="pb-2 text-left font-medium text-gray-700">SHA256</th>
417+
</tr>
418+
</thead>
419+
<tbody className="font-mono text-xs">
420+
{Object.entries(CHECKSUMS).map(([filename, hash]) => (
421+
<tr key={filename} className="border-b border-gray-100 last:border-0">
422+
<td className="py-2 pr-4 text-gray-700">{filename}</td>
423+
<td className="py-2">
424+
<div className="flex items-center gap-2">
425+
<code className="text-gray-500 truncate max-w-[200px] sm:max-w-none">
426+
{hash}
427+
</code>
428+
<CopyButton text={hash} />
429+
</div>
430+
</td>
431+
</tr>
432+
))}
433+
</tbody>
434+
</table>
435+
</div>
436+
<p className="mt-4 text-center text-xs text-gray-500">
437+
Checksums will be available after the first release.
438+
</p>
439+
</div>
440+
)}
441+
</div>
382442
</div>
383443
</section>
384444
);

apps/web/src/app/features/page.tsx

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {
1515
Pointer,
1616
Shield,
1717
Check,
18+
MessageSquare,
19+
CircleDot,
1820
} from 'lucide-react';
1921
import { Header } from '@/components/header';
2022
import { Footer } from '@/components/footer';
@@ -98,6 +100,32 @@ const mainFeatures = [
98100
'Direct download available',
99101
],
100102
},
103+
{
104+
icon: CircleDot,
105+
title: 'Screen Recording',
106+
description:
107+
'Record your sessions locally for later review. Perfect for tutorials, documentation, and keeping a record of pair programming sessions.',
108+
details: [
109+
'Record to WebM/MP4 locally',
110+
'System audio + microphone capture',
111+
'Quality presets (720p/1080p/4K)',
112+
'Pause/resume recording',
113+
],
114+
comingSoon: true,
115+
},
116+
{
117+
icon: MessageSquare,
118+
title: 'Text Chat',
119+
description:
120+
'Built-in text chat for when you need to share links, code snippets, or communicate without voice.',
121+
details: [
122+
'Real-time messaging',
123+
'System notifications (join/leave)',
124+
'Works alongside screen sharing',
125+
'Message history per session',
126+
],
127+
comingSoon: true,
128+
},
101129
];
102130

103131
const technicalFeatures = [
@@ -137,6 +165,8 @@ const comparisonFeatures = [
137165
{ feature: 'Screen sharing', pairux: true, others: true },
138166
{ feature: 'Remote control', pairux: true, others: true },
139167
{ feature: 'Simultaneous control', pairux: true, others: false },
168+
{ feature: 'Screen recording (local)', pairux: 'soon', others: 'partial' },
169+
{ feature: 'Text chat', pairux: 'soon', others: true },
140170
{ feature: 'No account for viewers', pairux: true, others: false },
141171
{ feature: 'Open source', pairux: true, others: false },
142172
{ feature: 'Self-hostable', pairux: true, others: false },
@@ -179,8 +209,15 @@ export default function FeaturesPage() {
179209
}`}
180210
>
181211
<div className={index % 2 === 1 ? 'lg:order-2' : ''}>
182-
<div className="flex h-14 w-14 items-center justify-center rounded-xl bg-primary-100 text-primary-600">
183-
<feature.icon className="h-7 w-7" />
212+
<div className="flex items-center gap-4">
213+
<div className="flex h-14 w-14 items-center justify-center rounded-xl bg-primary-100 text-primary-600">
214+
<feature.icon className="h-7 w-7" />
215+
</div>
216+
{'comingSoon' in feature && feature.comingSoon && (
217+
<span className="rounded-full bg-accent-100 px-3 py-1 text-xs font-medium text-accent-700">
218+
Coming Soon
219+
</span>
220+
)}
184221
</div>
185222
<h2 className="mt-6 text-3xl font-bold text-gray-900">
186223
{feature.title}

apps/web/src/app/page.tsx

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
Zap,
1111
Shield,
1212
RefreshCw,
13+
Quote,
1314
} from 'lucide-react';
1415
import { Header } from '@/components/header';
1516
import { Footer } from '@/components/footer';
@@ -200,8 +201,65 @@ export default function HomePage() {
200201
</div>
201202
</section>
202203

203-
{/* Security Section */}
204+
{/* Social Proof / Testimonials */}
204205
<section className="bg-white py-20 sm:py-28">
206+
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
207+
<div className="text-center">
208+
<h2 className="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">
209+
Loved by developers
210+
</h2>
211+
<p className="mx-auto mt-4 max-w-2xl text-lg text-gray-600">
212+
See what others are saying about PairUX.
213+
</p>
214+
</div>
215+
216+
<div className="mt-16 grid gap-8 md:grid-cols-3">
217+
{/* Testimonial placeholders */}
218+
{[
219+
{
220+
quote: 'Finally, a Screenhero replacement that actually works. The simultaneous control feature is game-changing for pair programming.',
221+
author: 'Coming Soon',
222+
role: 'Software Engineer',
223+
},
224+
{
225+
quote: 'The fact that viewers can join from any browser without installing anything makes this perfect for quick collaboration sessions.',
226+
author: 'Coming Soon',
227+
role: 'Tech Lead',
228+
},
229+
{
230+
quote: 'Open source, end-to-end encrypted, and it just works. This is exactly what the developer community needed.',
231+
author: 'Coming Soon',
232+
role: 'Open Source Contributor',
233+
},
234+
].map((testimonial, index) => (
235+
<div
236+
key={index}
237+
className="relative rounded-2xl border border-gray-200 bg-gray-50 p-8"
238+
>
239+
<Quote className="absolute top-6 right-6 h-8 w-8 text-primary-200" />
240+
<p className="text-gray-700 italic">&ldquo;{testimonial.quote}&rdquo;</p>
241+
<div className="mt-6 flex items-center gap-3">
242+
<div className="h-10 w-10 rounded-full bg-primary-200" />
243+
<div>
244+
<p className="font-semibold text-gray-900">{testimonial.author}</p>
245+
<p className="text-sm text-gray-500">{testimonial.role}</p>
246+
</div>
247+
</div>
248+
</div>
249+
))}
250+
</div>
251+
252+
<p className="mt-8 text-center text-sm text-gray-500">
253+
Want to share your experience?{' '}
254+
<Link href="https://github.com/pairux/pairux/discussions" target="_blank" rel="noopener noreferrer" className="text-primary-600 hover:underline">
255+
Join the discussion on GitHub
256+
</Link>
257+
</p>
258+
</div>
259+
</section>
260+
261+
{/* Security Section */}
262+
<section className="bg-gray-50 py-20 sm:py-28">
205263
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
206264
<div className="grid items-center gap-12 lg:grid-cols-2">
207265
<div>

0 commit comments

Comments
 (0)