Skip to content
Merged
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
19 changes: 18 additions & 1 deletion .github/workflows/deploy-landing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,15 @@ on:
branches: ["main"]
paths:
- "landing/**"
pull_request:
paths:
- "landing/**"
workflow_dispatch:

permissions:
contents: read
pull-requests: write

jobs:
deploy:
runs-on: ubuntu-latest
Expand All @@ -32,9 +39,19 @@ jobs:
run: npm run build

- name: Deploy to Cloudflare Pages
id: deploy
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy dist --project-name=pocketgraph-app
command: pages deploy dist --project-name=pocketgraph-app --branch=${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || 'main' }}
workingDirectory: landing

- name: Comment preview URL on PR
if: github.event_name == 'pull_request'
uses: thollander/actions-comment-pull-request@v3
with:
message: |
🔍 **Preview deployment ready!**
${{ steps.deploy.outputs.deployment-url }}
comment-tag: cloudflare-preview
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using System.Linq;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using Android.Runtime;
using Java.Security;
using Java.Security.Cert;
using Javax.Net.Ssl;
Expand All @@ -25,8 +26,9 @@ public NativeTrustManager()
var factory = TrustManagerFactory.GetInstance(TrustManagerFactory.DefaultAlgorithm);
factory.Init((KeyStore)null);
_androidTrustManager = factory.GetTrustManagers()
.OfType<IX509TrustManager>()
.First();
.OfType<Java.Lang.Object>()
.Select(m => m.JavaCast<IX509TrustManager>())
.First(m => m != null);
}

public override bool ValidateServerCertificate(Uri uri, X509Certificate2 certificate, X509Chain chain,
Expand Down
3 changes: 3 additions & 0 deletions landing/src/components/Footer.astro
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";
const PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=nl.resoftware.pocketgraph";
---
<footer>
<div class="section-inner footer-inner">
Expand All @@ -9,6 +10,7 @@ const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";
</div>
<div class="footer-links">
<a href={APP_STORE_URL} target="_blank" rel="noopener">App Store</a>
<a href={PLAY_STORE_URL} target="_blank" rel="noopener">Google Play</a>
<a href="https://github.com/resoftware/pocketgraph" target="_blank" rel="noopener">GitHub</a>
<a href="https://resoftware.nl/contact" target="_blank" rel="noopener">Support</a>
<a href="/privacy">Privacy Policy</a>
Expand Down Expand Up @@ -73,6 +75,7 @@ const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";

@media (max-width: 900px) {
.footer-inner { flex-direction: column; align-items: flex-start; }
.footer-links { flex-direction: column; gap: 0.6rem; }
.footer-copy { text-align: left; }
}
</style>
2 changes: 1 addition & 1 deletion landing/src/components/Meta.astro
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ interface Props {

const {
title = 'PocketGraph — Neo4j & Memgraph Client',
description = 'Connect to your Neo4j or Memgraph database from iPhone and iPad. Full Cypher editor, graph visualization, and Bolt protocol — in your pocket.',
description = 'Connect to your Neo4j or Memgraph database from iPhone, iPad, and Android. Full Cypher editor, graph visualization, and Bolt protocol — in your pocket.',
canonical,
} = Astro.props;

Expand Down
3 changes: 1 addition & 2 deletions landing/src/components/Nav.astro
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
---
const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";
---
<nav id="nav">
<div class="nav-inner">
<a href="/" class="nav-logo">
<img src="/logo.png" alt="PocketGraph icon" class="nav-icon" />
<span>PocketGraph</span>
</a>
<a href={APP_STORE_URL} class="nav-dl" target="_blank" rel="noopener">
<a href="#download" class="nav-dl">
Download
</a>
</div>
Expand Down
26 changes: 10 additions & 16 deletions landing/src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Nav from '../components/Nav.astro';
import Footer from '../components/Footer.astro';
import Meta from '../components/Meta.astro';
const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";
const PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=nl.resoftware.pocketgraph";
---
<!DOCTYPE html>
<html lang="en">
Expand Down Expand Up @@ -39,7 +40,7 @@ const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";
</h1>

<p class="hero-sub">
PocketGraph connects to any Neo4j or Memgraph database via the lightning-fast Bolt protocol — SSL-encrypted, query-ready, and beautifully visual. Available on iOS and iPadOS.
PocketGraph connects to any Neo4j or Memgraph database via the lightning-fast Bolt protocol — SSL-encrypted, query-ready, and beautifully visual. Available on iOS, iPadOS, and Android.
</p>

<div class="hero-cta">
Expand All @@ -49,21 +50,22 @@ const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";
</svg>
Download on the App Store
</a>
<span class="btn-store btn-disabled" aria-disabled="true">
<a href={PLAY_STORE_URL} class="btn-store" target="_blank" rel="noopener">
<svg width="20" height="20" viewBox="0 0 32 32" fill="currentColor" aria-hidden="true">
<path d="M17,14.5l4.2-4.5L4.9,1.2C4.8,1.1,4.6,1.1,4.3,1L17,14.5z"/>
<path d="M23,21l5.9-3.2c0.7-0.4,1.1-1,1.1-1.8s-0.4-1.5-1.1-1.8L23,11l-4.7,5L23,21z"/>
<path d="M2.4,1.9C2.1,2.2,2,2.6,2,3V29c0,0.4,0.1,0.8,0.4,1.2L15.6,16L2.4,1.9z"/>
<path d="M17,17.5L4.3,31c0.2,0,0.4-0.1,0.6-0.2L21.2,22L17,17.5z"/>
</svg>
Play Store &middot; Coming Soon
</span>
Get it on Google Play
</a>
<span class="price-label">&euro;8.99 &middot; one-time</span>
</div>

<div class="platform-pills">
<span>iOS 14.2+</span>
<span>iPadOS 14.2+</span>
<span>Android 8.0+</span>
</div>
</div>

Expand Down Expand Up @@ -187,7 +189,7 @@ const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";
</div>

<!-- ─── CTA ───────────────────────────────────────────────── -->
<section class="cta">
<section class="cta" id="download">
<div class="cta-glow"></div>
<div class="section-inner cta-inner">
<img src="/logo.png" alt="PocketGraph" class="cta-icon" />
Expand All @@ -202,15 +204,15 @@ const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";
</svg>
Download on App Store &middot; &euro;8.99
</a>
<span class="btn-store large btn-disabled" aria-disabled="true">
<a href={PLAY_STORE_URL} class="btn-store large" target="_blank" rel="noopener">
<svg width="22" height="22" viewBox="0 0 32 32" fill="currentColor" aria-hidden="true">
<path d="M17,14.5l4.2-4.5L4.9,1.2C4.8,1.1,4.6,1.1,4.3,1L17,14.5z"/>
<path d="M23,21l5.9-3.2c0.7-0.4,1.1-1,1.1-1.8s-0.4-1.5-1.1-1.8L23,11l-4.7,5L23,21z"/>
<path d="M2.4,1.9C2.1,2.2,2,2.6,2,3V29c0,0.4,0.1,0.8,0.4,1.2L15.6,16L2.4,1.9z"/>
<path d="M17,17.5L4.3,31c0.2,0,0.4-0.1,0.6-0.2L21.2,22L17,17.5z"/>
</svg>
Google Play &middot; Coming Soon
</span>
Get it on Google Play &middot; &euro;8.99
</a>
</div>
</div>
</section>
Expand Down Expand Up @@ -457,14 +459,6 @@ const APP_STORE_URL = "https://apps.apple.com/nl/app/pocketgraph/id1604368926";
box-shadow: 0 8px 32px rgba(255, 255, 255, 0.2);
background: #ffffff;
}
.btn-disabled {
opacity: 0.4;
cursor: not-allowed;
pointer-events: none;
background: transparent;
color: var(--teal);
border: 1px solid rgba(226,226,226,0.3);
}
.btn-store.large {
font-size: 1.05rem;
padding: 1rem 2rem;
Expand Down
10 changes: 5 additions & 5 deletions landing/src/pages/privacy.astro
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import Meta from '../components/Meta.astro';
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<Meta
title="Privacy Policy — PocketGraph"
description="Privacy policy for PocketGraph, the Neo4j & Memgraph client for iPhone and iPad."
description="Privacy policy for PocketGraph, the Neo4j & Memgraph client for iPhone, iPad, and Android."
canonical="/privacy"
/>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
Expand All @@ -34,7 +34,7 @@ import Meta from '../components/Meta.astro';

<section>
<h2>Overview</h2>
<p>PocketGraph is a graph database client for iPhone and iPad. We take your privacy seriously. This policy explains what data we collect, why, and how it is used.</p>
<p>PocketGraph is a graph database client for iPhone, iPad, and Android. We take your privacy seriously. This policy explains what data we collect, why, and how it is used.</p>
<p>The short version: <strong>PocketGraph does not collect, store, or transmit any of your database credentials or query data.</strong> All connections are made directly from your device to your database.</p>
</section>

Expand All @@ -53,11 +53,11 @@ import Meta from '../components/Meta.astro';
<h2>Data Stored on Your Device</h2>
<p>PocketGraph stores the following locally on your device only:</p>
<ul>
<li>Connection profiles (host, port, username) — stored in the iOS Keychain</li>
<li>Connection profiles (host, port, username) — stored in the iOS Keychain or Android Keystore</li>
<li>Query history — stored locally, never synced externally</li>
<li>App preferences and settings</li>
</ul>
<p>This data is protected by iOS system-level encryption and is not accessible to Re: Software.</p>
<p>This data is protected by system-level encryption (iOS Keychain / Android Keystore) and is not accessible to Re: Software.</p>
</section>

<section>
Expand All @@ -73,7 +73,7 @@ import Meta from '../components/Meta.astro';

<section>
<h2>Purchases</h2>
<p>PocketGraph is sold as a one-time purchase through the Apple App Store. All payment processing is handled by Apple. Re: Software does not receive or store any payment or billing information.</p>
<p>PocketGraph is sold as a one-time purchase through the Apple App Store and Google Play Store. All payment processing is handled by Apple or Google respectively. Re: Software does not receive or store any payment or billing information.</p>
</section>

<section>
Expand Down
Loading