Path: blob/master/webpage/src/components/HomepageFeatures/index.tsx
1007 views
import type {ReactNode} from 'react';1import clsx from 'clsx';2import Heading from '@theme/Heading';3import styles from './styles.module.css';45type FeatureItem = {6title: string;7Svg: React.ComponentType<React.ComponentProps<'svg'>>;8description: ReactNode;9isEven: boolean;10};1112let i = 1;1314const FeatureList: FeatureItem[] = [15{16isEven: i++ % 2 === 0,17title: 'Ultra Low Latency Streaming',18Svg: require('@site/static/img/undraw_low_latency.svg').default,19description: (20<>21Near real-time streaming with less than 300ms latency thanks to <a href="https://webrtc.org/">WebRTC</a>. <br />22Smooth video playback and synchronized audio for a seamless experience.23</>24),25},26{27isEven: i++ % 2 === 0,28title: 'Multi-Participant Control',29Svg: require('@site/static/img/undraw_miro.svg').default,30description: (31<>32Multiple participants in the room can share control with each other. <br />33The host has the ability to give control to others or deny control requests.34</>35),36},37{38isEven: i++ % 2 === 0,39title: 'Live Broadcasting',40Svg: require('@site/static/img/undraw_online_media.svg').default,41description: (42<>43Stream your room's content live to platforms like Twitch, YouTube, and more via RTMP. As the host, you have full44control over the stream; set the RTMP URL and stream key, start or stop the broadcast at any time. Even if no45participants are online, the stream keeps running, making 24/7 broadcasting effortless.46</>47),48},49{50isEven: i++ % 2 === 0,51title: 'Persistent Browser',52Svg: require('@site/static/img/undraw_safe.svg').default,53description: (54<>55Keep your browser session alive, no matter where you are. Resume your work from any device without losing your progress.56Ideal for long-running tasks like downloads, uploads, and monitoring. No local data is stored; cookies and session data57stay protected. For your ISP, it just looks like you're watching a video or on a call, keeping your activity private.58</>59),60},61{62isEven: i++ % 2 === 0,63title: 'Throwaway Browser',64Svg: require('@site/static/img/undraw_throw_away.svg').default,65description: (66<>67Access websites without leaving a trace. Every session runs in an isolated environment and is destroyed afterward;68no history, cookies, or cache left behind. Perfect for handling sensitive information or testing websites without69affecting your local machine. Minimize OS fingerprinting and browser exploits by running in a secure container.70Need extra privacy? Use Tor Browser and VPN for added anonymity.71</>72),73},74{75isEven: i++ % 2 === 0,76title: 'Jump Host for Internal Resources',77Svg: require('@site/static/img/undraw_software_engineer.svg').default,78description: (79<>80Access internal resources like servers, databases, and websites from a remote location.81You can record all session activities for auditing and compliance.82Ensuring that no data is left on the client side and minimizing the risk of data leakage.83Making it harder for attackers to pivot to other systems when they compromise the jump host and reducing the attack surface.84</>85),86},87{88isEven: i++ % 2 === 0,89title: 'Protect Your Intellectual Property',90Svg: require('@site/static/img/undraw_security.svg').default,91description: (92<>93Have you ever wanted to share your website, AI model, or software with someone without giving them access to the code?94With WebRTC, only the video and audio are shared, not the actual data. Nobody can reverse-engineer your code because it is not even running on their machine.95You have full control over who can access your content and can revoke access at any time.96</>97),98},99];100101function Feature({title, Svg, description, isEven}: FeatureItem) {102return (103<div className={clsx('row', styles.featureRow, { [styles.featureRowReverse]: !isEven })}>104<div className={clsx('col col--5', 'text--center')}>105<Svg className={styles.featureSvg} role="img" />106</div>107<div className={clsx('col col--7', 'padding-horiz--md')}>108<Heading as="h3">{title}</Heading>109<p>{description}</p>110</div>111</div>112);113}114115export default function HomepageFeatures(): ReactNode {116return (117<section className={styles.features}>118<div id="features" className="container">119<h1 className={"text--center"}>Features</h1>120{FeatureList.map((props, idx) => (121<Feature key={idx} {...props} />122))}123</div>124</section>125);126}127128129