Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions apps/api/.env.production
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ CONTENTFUL_HOST="cdn.contentful.com"

GOOGLE_REDIRECT_URI="https://getjetstream.app/oauth/google/callback"

HONEYCOMB_ENABLED=true

JETSTREAM_CLIENT_URL="https://getjetstream.app/app"
JETSTREAM_SERVER_DOMAIN="getjetstream.app"
JETSTREAM_SERVER_URL="https://getjetstream.app"
Expand Down
2 changes: 1 addition & 1 deletion apps/landing/components/LastUpdated.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ interface LastUpdatedProps {
| 29
| 30
| 31;
year: 2023 | 2024 | 2025;
year: 2023 | 2024 | 2025 | 2026;
}

export default function LastUpdated({ className, day, month, year }: LastUpdatedProps) {
Expand Down
16 changes: 12 additions & 4 deletions apps/landing/pages/privacy/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export default function Page() {
const email = 'support@getjetstream.app';
return (
<div className="m-8">
<LastUpdated className="text-gray-500" day={2} month="November" year={2025} />
<LastUpdated className="text-gray-500" day={4} month="January" year={2026} />
<h1>Privacy Policy</h1>
<p className="mb-2 pl-2">
This Privacy Policy describes how your personal information is collected, used, and shared when you visit or make a purchase from
Expand All @@ -21,7 +21,9 @@ export default function Page() {
</li>
<li>We never store any of your Salesforce record data.</li>
<li>We use browser-based caching to avoid having to store any metadata on our server.</li>
<li>We will never make API requests to Salesforce without explicit action from a user, such as executing a query.</li>
<li>
We will never make API requests to access any Salesforce data without explicit action from a user, such as executing a query.
</li>
<li>
All data stored by Jetstream is{' '}
<a
Expand All @@ -36,7 +38,8 @@ export default function Page() {
</li>
<li>
Some metadata, such as Object and Field names may be included in log entries for up to 1 year with our logging provider. This is
used only for the purpose of troubleshooting errors and ensuring auditability for security purposes.
used only for the purpose of troubleshooting errors and ensuring auditability for security purposes. We make every reasonable
effort to avoid including any sensitive information in our logs at the application level and via log redaction.
</li>
<li>
If there is a fatal error with the application, our bug tracker may store metadata and error messages based on whatever Salesforce
Expand Down Expand Up @@ -149,7 +152,8 @@ export default function Page() {
above. Additionally, please note that your information will be transferred outside of Europe, to the United States.
<h2>DATA RETENTION</h2>
<p className="mb-2 pl-2">
We will store information in our logs for up to 14 days. We will store information related to errors for up to 30 days.
We will store information in our logs for up to 365 days in order to be able to research issues and security events. We will store
information related to errors for up to 30 days.
</p>
<h2>MINORS</h2>
<p className="mb-2 pl-2">The Site is not intended for individuals under the age of 13.</p>
Expand All @@ -158,6 +162,10 @@ export default function Page() {
We may update this privacy policy from time to time in order to reflect, for example, changes to our practices or for other
operational, legal or regulatory reasons.
</p>
<p className="mb-2 pl-2">
We may make non-material changes to this Privacy Policy without prior notice. If we make material changes to this Privacy Policy, we
will notify you either through the email address you have provided us, or by placing a prominent notice on our website.
</p>
<h2>CONTACT US</h2>
<p className="mb-2 pl-2">
For more information about our privacy practices, if you have questions, or if you would like to make a complaint, contact us by
Expand Down
155 changes: 101 additions & 54 deletions apps/landing/pages/subprocessors/index.tsx
Original file line number Diff line number Diff line change
@@ -1,97 +1,144 @@
import { CheckIcon, XMarkIcon } from '@heroicons/react/20/solid';
import LastUpdated from '../../components/LastUpdated';
import Layout from '../../components/layouts/Layout';
import { ROUTES } from '../../utils/environment';

const YesIcon = <CheckIcon className="h-6 w-6 text-green-600" aria-hidden="true" />;
const NoIcon = <XMarkIcon className="h-6 w-6 text-gray-600" aria-hidden="true" />;
Comment on lines +6 to +7
Copy link

Copilot AI Jan 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The icons are missing appropriate accessibility attributes. While aria-hidden is set to true, screen reader users won't receive any information about whether a feature is optional or not. Consider adding appropriate aria-label attributes to communicate this information to assistive technologies, or ensure the table cell has additional text content that screen readers can access.

Suggested change
const YesIcon = <CheckIcon className="h-6 w-6 text-green-600" aria-hidden="true" />;
const NoIcon = <XMarkIcon className="h-6 w-6 text-gray-600" aria-hidden="true" />;
const YesIcon = (
<CheckIcon
className="h-6 w-6 text-green-600"
role="img"
aria-label="Optional feature"
/>
);
const NoIcon = (
<XMarkIcon
className="h-6 w-6 text-gray-600"
role="img"
aria-label="Required feature"
/>
);

Copilot uses AI. Check for mistakes.

const webSubProcessors = [
{ name: 'BackBlaze', function: 'Asset storage', location: 'US', optional: 'No', extension: false },
{ name: 'BetterStack', function: 'Server Logging and Status Page', location: 'US', optional: 'No', extension: false },
{ name: 'Amplitude', function: 'Telemetry', location: 'US', optional: 'Yes, opt-in via cookie consent banner.', extension: false },
{ name: 'Cloudflare', function: 'Infrastructure', location: 'US', optional: 'No', extension: false },
{
name: 'BackBlaze',
function: 'Object storage to store database backups',
location: 'US',
optional: NoIcon,
extension: false,
desktop: false,
salesforceCanvas: false,
},
{
name: 'BetterStack',
function: 'Server logging; alerts; incident management and status page',
location: 'US',
optional: NoIcon,
extension: false,
desktop: false,
salesforceCanvas: false,
},
{
name: 'Amplitude',
function: 'Telemetry',
location: 'US',
optional: 'Yes, opt-in via cookie consent banner.',
Copy link

Copilot AI Jan 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Amplitude entry has inconsistent data structure. While other entries use either NoIcon or YesIcon for the optional field, this entry uses a string. This inconsistency will cause rendering issues since NoIcon and YesIcon are React components (CheckIcon/XMarkIcon), but this will render the string directly. For consistency and proper rendering, consider using YesIcon and adding a tooltip or note elsewhere if additional context is needed.

Suggested change
optional: 'Yes, opt-in via cookie consent banner.',
optional: YesIcon,

Copilot uses AI. Check for mistakes.
extension: false,
desktop: false,
salesforceCanvas: false,
},
{
name: 'Cloudflare',
function: 'CDN / DDoS Protection / WAF / DNS',
location: 'US',
optional: NoIcon,
extension: false,
desktop: true,
salesforceCanvas: true,
},
{
name: 'Google Cloud',
function: 'File storage',
function: 'Identity (if OAuth is used) and optional Google Drive integration.',
location: 'US',
optional: 'File storage is opt-in, used if you use Google Drive to save and read files.',
extension: true,
optional: 'Yes',
Copy link

Copilot AI Jan 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to Amplitude, the Google Cloud entry uses a string value for the optional field instead of YesIcon component. This creates an inconsistent data structure where some entries have React components and others have strings in the same field. This should be changed to YesIcon for consistency with the table's visual design.

Suggested change
optional: 'Yes',
optional: YesIcon,

Copilot uses AI. Check for mistakes.
extension: false,
desktop: false,
salesforceCanvas: false,
},
{
name: 'Google Ads',
function: 'Analytics',
location: 'US',
optional: 'Yes, opt-in via cookie consent banner.',
Copy link

Copilot AI Jan 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Google Ads entry uses a string value for the optional field, creating the same inconsistency as Amplitude and Google Cloud entries. For consistent rendering and visual design, this should use YesIcon instead of the string "Yes, opt-in via cookie consent banner."

Suggested change
optional: 'Yes, opt-in via cookie consent banner.',
optional: YesIcon,

Copilot uses AI. Check for mistakes.
extension: true,
desktop: false,
salesforceCanvas: false,
},
{
name: 'Honeycomb',
function: 'Server Metrics',
name: 'Mailgun',
function: 'Transactional email',
location: 'US',
optional: 'No, does not process personal data.',
optional: NoIcon,
extension: true,
desktop: true,
salesforceCanvas: true,
},
{
name: 'Render',
function: 'Cloud hosting and infrastructure; Data Storage',
location: 'US',
optional: NoIcon,
extension: true,
desktop: true,
salesforceCanvas: true,
},
{
name: 'Rollbar',
function: 'Bug reporting and tracking',
location: 'US',
optional: NoIcon,
extension: false,
desktop: false,
salesforceCanvas: false,
},
{ name: 'Stripe', function: 'Billing', location: 'US', optional: NoIcon, extension: false, desktop: false, salesforceCanvas: false },
{
name: 'Salesforce.com',
function: 'Application Core',
location: 'US',
optional: NoIcon,
extension: true,
desktop: true,
salesforceCanvas: true,
},
{ name: 'Mailgun', function: 'Email', location: 'US', optional: 'No', extension: true },
{ name: 'Render', function: 'Infrastructure / Data Storage', location: 'US', optional: 'No', extension: true },
{ name: 'Rollbar', function: 'Bug Detection and Tracking', location: 'US', optional: 'No', extension: false },
{ name: 'Stripe', function: 'Billing', location: 'US', optional: 'No', extension: false },
{ name: 'Salesforce.com', function: 'Application Core', location: 'US', optional: 'No', extension: true },
];
].sort((a, b) => a.name.localeCompare(b.name));

export default function Page() {
return (
<div className="m-8">
<LastUpdated className="text-gray-500" day={3} month="November" year={2025} />
<LastUpdated className="text-gray-500" day={4} month="January" year={2026} />
<h1>Jetstream Sub-Processors</h1>
<p className="mb-2 pl-2">
This page provides a list of sub-processors that Jetstream uses to provide services to our customers. Our web-based application and
Browser Extension have a different set of processors and different opt-in/opt-out capabilities.
This page provides a list of sub-processors that Jetstream uses to provide services to our customers. Our web-based application
Copy link

Copilot AI Jan 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sentence is grammatically incorrect. "Our web-based application other platforms" is missing a connector word. It should be "Our web-based application and other platforms" to properly connect the two parts of the sentence.

Suggested change
This page provides a list of sub-processors that Jetstream uses to provide services to our customers. Our web-based application
This page provides a list of sub-processors that Jetstream uses to provide services to our customers. Our web-based application and

Copilot uses AI. Check for mistakes.
other platforms have a different set of processors and different opt-in/opt-out capabilities.
</p>
<p className="mb-2 pl-2">We maintain up-to-date DPAs with each sub-processor.</p>
<h2 className="mt-8">Web-based version of Jetstream</h2>

<table>
<table className="border-collapse border border-gray-400">
<thead>
<tr>
<th className="text-left p-3">Sub-Processor Name</th>
<th className="text-left p-3">Function</th>
<th className="text-left p-3">Location</th>
<th className="text-left p-3">Optional / Allow opt-out</th>
<th className="border border-gray-300 text-left p-3">Sub-Processor Name</th>
<th className="border border-gray-300 text-left p-3">Function</th>
<th className="border border-gray-300 text-left p-3">Location</th>
<th className="border border-gray-300 text-left p-3">Optional</th>
<th className="border border-gray-300 text-left p-3">Web</th>
<th className="border border-gray-300 text-left p-3">Browser Extension</th>
<th className="border border-gray-300 text-left p-3">Desktop</th>
{/* <th className="text-left p-3">Salesforce Canvas</th> */}
</tr>
</thead>
<tbody>
{webSubProcessors.map((item) => (
<tr key={item.name}>
<td className="p-3">{item.name}</td>
<td className="p-3">{item.function}</td>
<td className="p-3">{item.location}</td>
<td className="p-3">{item.optional}</td>
<td className="border border-gray-300 p-3">{item.name}</td>
<td className="border border-gray-300 p-3">{item.function}</td>
<td className="border border-gray-300 p-3">{item.location}</td>
<td className="border border-gray-300 p-3">{item.optional}</td>
<td className="border border-gray-300 p-3">{YesIcon}</td>
Copy link

Copilot AI Jan 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The table structure renders all entries with YesIcon in the "Web" column (line 134), but the data structure doesn't include a web property. This means all subprocessors are displayed as available for Web, which may not be accurate. Consider adding a web property to each entry in the webSubProcessors array or using a different approach to indicate which platforms each subprocessor supports.

Copilot uses AI. Check for mistakes.
<td className="border border-gray-300 p-3">{item.extension ? YesIcon : NoIcon}</td>
<td className="border border-gray-300 p-3">{item.desktop ? YesIcon : NoIcon}</td>
{/* <td className="p-3">{item.salesforceCanvas ? {YesIcon} : {NoIcon}}</td> */}
Copy link

Copilot AI Jan 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The commented-out code contains a JSX syntax error. The curly braces are incorrectly placed around YesIcon and NoIcon, which are already variables. It should be either {YesIcon} or {NoIcon} without the extra braces. However, since this is commented out code that appears to be for a future Salesforce Canvas column, consider removing it entirely to keep the codebase clean, or fix the syntax if it will be uncommented soon.

Suggested change
{/* <td className="p-3">{item.salesforceCanvas ? {YesIcon} : {NoIcon}}</td> */}

Copilot uses AI. Check for mistakes.
</tr>
))}
</tbody>
</table>

<h2 className="mt-8">Browser Extension version of Jetstream</h2>

<table>
<thead>
<tr>
<th className="text-left p-3">Sub-Processor Name</th>
<th className="text-left p-3">Function</th>
<th className="text-left p-3">Location</th>
<th className="text-left p-3">Optional / Allow opt-out</th>
</tr>
</thead>
<tbody>
{webSubProcessors
.filter((item) => item.extension)
.map((item) => (
<tr key={item.name}>
<td className="p-3">{item.name}</td>
<td className="p-3">{item.function}</td>
<td className="p-3">{item.location}</td>
<td className="p-3">{item.optional}</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
Expand Down
6 changes: 0 additions & 6 deletions libs/api-config/src/lib/env-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -220,12 +220,6 @@ const envSchema = z.object({
GOOGLE_APP_ID: z.string().optional(),
GOOGLE_API_KEY: z.string().optional(),
GOOGLE_CLIENT_ID: z.string().optional(),
/**
* HONEYCOMB
* This is used for logging node application metrics
*/
HONEYCOMB_ENABLED: booleanSchema,
HONEYCOMB_API_KEY: z.string().optional(),
/**
* GEO-IP API (private service basic auth)
*/
Expand Down