Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a45391d91 | ||
|
|
44b90cd132 | ||
|
|
03f45d4a16 | ||
|
|
8876c5328b | ||
|
|
b08d010a9a | ||
|
|
0e4b47704c | ||
|
|
9611567daa | ||
|
|
0bc5110e05 | ||
|
|
2433697951 |
+10
@@ -38,3 +38,13 @@ docs/superpowers/
|
|||||||
.env
|
.env
|
||||||
!.env.example
|
!.env.example
|
||||||
.worktrees/
|
.worktrees/
|
||||||
|
|
||||||
|
# Bundled DB client tools (built/downloaded during release, never committed)
|
||||||
|
desktop/src-tauri/resources/pg_tools/pg_dump
|
||||||
|
desktop/src-tauri/resources/pg_tools/pg_restore
|
||||||
|
desktop/src-tauri/resources/pg_tools/psql
|
||||||
|
desktop/src-tauri/resources/pg_tools/libpq.5.dylib
|
||||||
|
desktop/src-tauri/resources/mysql_tools/mariadb
|
||||||
|
desktop/src-tauri/resources/mysql_tools/mariadb-dump
|
||||||
|
desktop/src-tauri/resources/mysql_tools/libcrypto.3.dylib
|
||||||
|
desktop/src-tauri/resources/mysql_tools/libssl.3.dylib
|
||||||
|
|||||||
Generated
+1
-1
@@ -1783,7 +1783,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gridline"
|
name = "gridline"
|
||||||
version = "0.7.11"
|
version = "0.7.12"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
|||||||
@@ -10,9 +10,7 @@ export default defineConfig({
|
|||||||
compressHTML: true,
|
compressHTML: true,
|
||||||
trailingSlash: 'ignore',
|
trailingSlash: 'ignore',
|
||||||
integrations: [
|
integrations: [
|
||||||
sitemap({
|
sitemap(),
|
||||||
lastmod: new Date(),
|
|
||||||
}),
|
|
||||||
react(),
|
react(),
|
||||||
],
|
],
|
||||||
vite: {
|
vite: {
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
/* /404.html 404
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 6.4 KiB |
@@ -59,12 +59,12 @@
|
|||||||
const isMobile = /Mobi|Android|iPhone|iPad|iPod/i.test(userAgent);
|
const isMobile = /Mobi|Android|iPhone|iPad|iPod/i.test(userAgent);
|
||||||
const keepLabel = downloadBtn.hasAttribute("data-download-label");
|
const keepLabel = downloadBtn.hasAttribute("data-download-label");
|
||||||
|
|
||||||
const releasesUrl = "https://github.com/AdrianBonpin/gridline/releases";
|
const releasesUrl = "https://git.ranio.xyz/adrianbonpin/gridline/releases";
|
||||||
const version = "0.7.10";
|
const version = "0.7.12";
|
||||||
|
|
||||||
if (isMobile) {
|
if (isMobile) {
|
||||||
downloadBtn.href = releasesUrl;
|
downloadBtn.href = releasesUrl;
|
||||||
if (!keepLabel) downloadBtn.textContent = "Get it on GitHub";
|
if (!keepLabel) downloadBtn.textContent = "Get it on Gitea";
|
||||||
} else if (isMac) {
|
} else if (isMac) {
|
||||||
downloadBtn.href = `${releasesUrl}/download/v${version}/Gridline_${version}_aarch64.dmg`;
|
downloadBtn.href = `${releasesUrl}/download/v${version}/Gridline_${version}_aarch64.dmg`;
|
||||||
if (!keepLabel) downloadBtn.textContent = "Download for macOS";
|
if (!keepLabel) downloadBtn.textContent = "Download for macOS";
|
||||||
|
|||||||
@@ -12,6 +12,12 @@
|
|||||||
"sizes": "any",
|
"sizes": "any",
|
||||||
"type": "image/svg+xml",
|
"type": "image/svg+xml",
|
||||||
"purpose": "any"
|
"purpose": "any"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-touch-icon.png",
|
||||||
|
"sizes": "180x180",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "any"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,15 @@ export interface ChangelogEntry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const changelogEntries: ChangelogEntry[] = [
|
export const changelogEntries: ChangelogEntry[] = [
|
||||||
|
{
|
||||||
|
version: "0.7.12",
|
||||||
|
date: "2026-09-01",
|
||||||
|
highlights: [
|
||||||
|
"Reliable cell editing for non-text columns — editing a PostgreSQL cell whose type isn't text (integers, booleans, UUIDs, json/jsonb, timestamps, enums, numerics) now works; edited values are sent to PostgreSQL in text wire format so the server parses them into the column's own type.",
|
||||||
|
"Recent connections fix — the Recent strip no longer renders empty on first launch when the connections list hadn't loaded yet.",
|
||||||
|
"Full CI release pipeline for Windows — the self-hosted Windows runner now builds the .exe/.msi installers (bundled pg_dump/pg_restore/psql + MariaDB clients) and uploads them to the release alongside Linux.",
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
version: "0.7.10",
|
version: "0.7.10",
|
||||||
date: "2026-08-13",
|
date: "2026-08-13",
|
||||||
|
|||||||
@@ -36,8 +36,13 @@ const isProd = import.meta.env.PROD;
|
|||||||
<link rel="canonical" href={canonicalURL} />
|
<link rel="canonical" href={canonicalURL} />
|
||||||
<link rel="sitemap" href="/sitemap-index.xml" />
|
<link rel="sitemap" href="/sitemap-index.xml" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/gridline-icon.svg" />
|
<link rel="icon" type="image/svg+xml" href="/gridline-icon.svg" />
|
||||||
<link rel="apple-touch-icon" href="/gridline-icon.svg" />
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||||||
<link rel="manifest" href="/site.webmanifest" />
|
<link rel="manifest" href="/site.webmanifest" />
|
||||||
|
<link rel="preload" as="image" href="/og.png" />
|
||||||
|
<link rel="preconnect" href="https://stat.ranio.xyz" crossorigin />
|
||||||
|
<link rel="preconnect" href="https://git.ranio.xyz" />
|
||||||
|
<link rel="dns-prefetch" href="https://stat.ranio.xyz" />
|
||||||
|
<link rel="dns-prefetch" href="https://git.ranio.xyz" />
|
||||||
|
|
||||||
<meta property="og:title" content={title} />
|
<meta property="og:title" content={title} />
|
||||||
<meta property="og:description" content={description} />
|
<meta property="og:description" content={description} />
|
||||||
@@ -54,6 +59,7 @@ const isProd = import.meta.env.PROD;
|
|||||||
<meta name="twitter:title" content={title} />
|
<meta name="twitter:title" content={title} />
|
||||||
<meta name="twitter:description" content={description} />
|
<meta name="twitter:description" content={description} />
|
||||||
<meta name="twitter:image" content={ogImageURL} />
|
<meta name="twitter:image" content={ogImageURL} />
|
||||||
|
<meta name="twitter:image:alt" content="Gridline — the open-source database GUI" />
|
||||||
<meta name="twitter:site" content="@AdrianBonpin" />
|
<meta name="twitter:site" content="@AdrianBonpin" />
|
||||||
<meta name="twitter:creator" content="@AdrianBonpin" />
|
<meta name="twitter:creator" content="@AdrianBonpin" />
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
buildWebSiteJsonLd,
|
buildWebSiteJsonLd,
|
||||||
buildBreadcrumbJsonLd,
|
buildBreadcrumbJsonLd,
|
||||||
buildTitle,
|
buildTitle,
|
||||||
|
buildProductJsonLd,
|
||||||
} from "./seo";
|
} from "./seo";
|
||||||
|
|
||||||
describe("seo builders", () => {
|
describe("seo builders", () => {
|
||||||
@@ -70,4 +71,18 @@ describe("seo builders", () => {
|
|||||||
it("buildTitle appends the brand", () => {
|
it("buildTitle appends the brand", () => {
|
||||||
expect(buildTitle("PostgreSQL GUI")).toBe("PostgreSQL GUI | Gridline");
|
expect(buildTitle("PostgreSQL GUI")).toBe("PostgreSQL GUI | Gridline");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("buildProductJsonLd returns valid Product schema", () => {
|
||||||
|
const ld = buildProductJsonLd({
|
||||||
|
name: "Gridline",
|
||||||
|
url: "https://getgridline.app/",
|
||||||
|
description: "Open-source database GUI",
|
||||||
|
image: "https://getgridline.app/og.png",
|
||||||
|
offersPrice: 0,
|
||||||
|
offersCurrency: "USD",
|
||||||
|
});
|
||||||
|
expect(ld["@type"]).toBe("Product");
|
||||||
|
expect(ld.name).toBe("Gridline");
|
||||||
|
expect((ld.offers as { price: number }).price).toBe(0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -108,3 +108,26 @@ export function buildBreadcrumbJsonLd(
|
|||||||
export function buildTitle(primary: string, brand = "Gridline"): string {
|
export function buildTitle(primary: string, brand = "Gridline"): string {
|
||||||
return `${primary} | ${brand}`;
|
return `${primary} | ${brand}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function buildProductJsonLd(opts: {
|
||||||
|
name: string;
|
||||||
|
url: string;
|
||||||
|
description: string;
|
||||||
|
image: string;
|
||||||
|
offersPrice: number;
|
||||||
|
offersCurrency: string;
|
||||||
|
}): JsonLd {
|
||||||
|
return {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "Product",
|
||||||
|
name: opts.name,
|
||||||
|
url: opts.url,
|
||||||
|
description: opts.description,
|
||||||
|
image: opts.image,
|
||||||
|
offers: {
|
||||||
|
"@type": "Offer",
|
||||||
|
price: opts.offersPrice,
|
||||||
|
priceCurrency: opts.offersCurrency,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import {
|
|||||||
buildFaqJsonLd,
|
buildFaqJsonLd,
|
||||||
buildOrganizationJsonLd,
|
buildOrganizationJsonLd,
|
||||||
buildWebSiteJsonLd,
|
buildWebSiteJsonLd,
|
||||||
|
buildProductJsonLd,
|
||||||
|
buildBreadcrumbJsonLd,
|
||||||
} from "../lib/seo";
|
} from "../lib/seo";
|
||||||
import { Image } from "astro:assets";
|
import { Image } from "astro:assets";
|
||||||
import HeroDbViewer from "../components/hero/HeroDbViewer";
|
import HeroDbViewer from "../components/hero/HeroDbViewer";
|
||||||
@@ -42,9 +44,21 @@ const jsonLd = [
|
|||||||
name: "Gridline",
|
name: "Gridline",
|
||||||
url: `${site}/`,
|
url: `${site}/`,
|
||||||
}),
|
}),
|
||||||
|
buildProductJsonLd({
|
||||||
|
name: "Gridline",
|
||||||
|
url: `${site}/`,
|
||||||
|
description:
|
||||||
|
"The open-source database GUI for PostgreSQL, MySQL, SQLite, and Redis. No paywalls, no tab limits, fully open source.",
|
||||||
|
image: `${site}/og.png`,
|
||||||
|
offersPrice: 0,
|
||||||
|
offersCurrency: "USD",
|
||||||
|
}),
|
||||||
|
buildBreadcrumbJsonLd([
|
||||||
|
{ name: "Home", url: `${site}/` },
|
||||||
|
]),
|
||||||
];
|
];
|
||||||
---
|
---
|
||||||
<Layout title="Gridline — Open-Source Database GUI" jsonLd={jsonLd}>
|
<Layout title="Gridline — Free Open-Source Database GUI" jsonLd={jsonLd}>
|
||||||
<script src="/landing.js" defer></script>
|
<script src="/landing.js" defer></script>
|
||||||
|
|
||||||
<!-- Hero -->
|
<!-- Hero -->
|
||||||
|
|||||||
Reference in New Issue
Block a user