Skip to content

Commit 60880ac

Browse files
author
Ubuntu
committed
feat: add updates hub for stable feed growth
1 parent f25dd34 commit 60880ac

7 files changed

Lines changed: 292 additions & 5 deletions

File tree

README.en.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
[![Status Feed](https://img.shields.io/badge/status-live-1d221c)](https://raw.githubusercontent.com/Au1rxx/free-vpn-subscriptions/main/output/status.json)
66
[![Latest Release](https://img.shields.io/github/v/release/Au1rxx/free-vpn-subscriptions)](https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest)
77

8-
Free Clash, sing-box, and V2Ray subscription links with live node status, multi-region coverage, and setup guides for common clients.
8+
Free Clash, sing-box, and V2Ray subscription links with live node status, multi-region coverage, setup guides for common clients, and a dedicated updates page for release snapshots.
99

10-
[Open Live Status Site](https://au1rxx.github.io/free-vpn-subscriptions/)[Status Dashboard](https://au1rxx.github.io/free-vpn-subscriptions/status.html)[Clash Guide](./docs/clash-subscription.md)[sing-box Guide](./docs/sing-box-subscription.md)[V2Ray Guide](./docs/v2ray-subscription.md)[FAQ](./docs/faq.md)
10+
[Open Live Status Site](https://au1rxx.github.io/free-vpn-subscriptions/)[Updates And Snapshot History](https://au1rxx.github.io/free-vpn-subscriptions/updates.html)[Status Dashboard](https://au1rxx.github.io/free-vpn-subscriptions/status.html)[Clash Guide](./docs/clash-subscription.md)[sing-box Guide](./docs/sing-box-subscription.md)[V2Ray Guide](./docs/v2ray-subscription.md)[FAQ](./docs/faq.md)
1111

1212
## Why This Repo
1313

@@ -38,6 +38,12 @@ Use Releases as a backup distribution channel, a snapshot archive, or a clean do
3838
| V2Ray | `https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest/download/v2ray-base64.txt` |
3939
| Status | `https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest/download/status.json` |
4040

41+
## Why The Main Subscription URLs Stay Stable
42+
43+
- Stable URLs are better for client auto-refresh and prevent old guides, bookmarks, and shared posts from breaking.
44+
- Returning traffic should come from updates, release snapshots, live status, and new documentation, not from rotating the core feed URLs.
45+
- Use the [Updates And Snapshot History](https://au1rxx.github.io/free-vpn-subscriptions/updates.html) page when you want to check recent release activity or download checkpoints manually.
46+
4147
## Supported Clients
4248

4349
- Clash Verge / Clash Meta / Mihomo-compatible clients

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
公开提供 Clash、sing-box、V2Ray 订阅链接,附带实时节点状态、多地区覆盖、客户端导入教程与故障排查页面。
1111

12-
[打开站点首页](https://au1rxx.github.io/free-vpn-subscriptions/)[状态面板](https://au1rxx.github.io/free-vpn-subscriptions/status.html)[Clash 指南](./docs/clash-subscription.md)[sing-box 指南](./docs/sing-box-subscription.md)[V2Ray 指南](./docs/v2ray-subscription.md)[FAQ](./docs/faq.md)
12+
[打开站点首页](https://au1rxx.github.io/free-vpn-subscriptions/)[更新记录与快照历史](https://au1rxx.github.io/free-vpn-subscriptions/updates.html)[状态面板](https://au1rxx.github.io/free-vpn-subscriptions/status.html)[Clash 指南](./docs/clash-subscription.md)[sing-box 指南](./docs/sing-box-subscription.md)[V2Ray 指南](./docs/v2ray-subscription.md)[FAQ](./docs/faq.md)
1313

1414
## 项目定位
1515

@@ -40,6 +40,12 @@
4040
| V2Ray | `https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest/download/v2ray-base64.txt` |
4141
| 状态 | `https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest/download/status.json` |
4242

43+
## 为什么主订阅链接保持不变
44+
45+
- 固定订阅 URL 更适合客户端长期自动刷新,不会因为链接轮换导致旧教程、旧收藏和客户端配置失效。
46+
- 用户回访不应依赖“换链接”,而应依赖“看更新”。这个项目把回访入口放在状态页、更新记录页和 Releases 快照历史中。
47+
- 想确认最近有没有刷新、是否有历史快照、要不要手动下载,请直接看 [更新记录与快照历史](https://au1rxx.github.io/free-vpn-subscriptions/updates.html)
48+
4349
## 支持的客户端
4450

4551
- Clash Verge / Clash Meta / Mihomo 兼容客户端

site/app.js

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
const RELEASES_ENDPOINT =
2+
"https://api.github.com/repos/Au1rxx/free-vpn-subscriptions/releases?per_page=6";
3+
4+
function formatUtcStamp(value) {
5+
return value ? value.replace("T", " ").replace("Z", " UTC") : "";
6+
}
7+
8+
function escapeHtml(value) {
9+
return String(value)
10+
.replaceAll("&", "&")
11+
.replaceAll("<", "&lt;")
12+
.replaceAll(">", "&gt;")
13+
.replaceAll('"', "&quot;")
14+
.replaceAll("'", "&#39;");
15+
}
16+
117
async function loadStatus() {
218
const activeCount = document.getElementById("active-count");
319
const statusStamp = document.getElementById("status-stamp");
@@ -23,7 +39,7 @@ async function loadStatus() {
2339

2440
activeCount.textContent = `${active.length} / ${nodes.length} active`;
2541
statusStamp.textContent = latestCheck
26-
? `Last check ${latestCheck.replace("T", " ").replace("Z", " UTC")}`
42+
? `Last check ${formatUtcStamp(latestCheck)}`
2743
: "No recent status timestamp";
2844

2945
nodeList.innerHTML = nodes
@@ -42,7 +58,7 @@ async function loadStatus() {
4258
</div>
4359
<div class="node-meta">
4460
<strong>${latency}</strong>
45-
<span>${node.last_check_at ? node.last_check_at.replace("T", " ").replace("Z", " UTC") : "No timestamp"}</span>
61+
<span>${node.last_check_at ? formatUtcStamp(node.last_check_at) : "No timestamp"}</span>
4662
</div>
4763
<div>
4864
<span class="status-pill ${activeNode ? "active" : "offline"}">
@@ -60,4 +76,80 @@ async function loadStatus() {
6076
}
6177
}
6278

79+
async function loadReleases() {
80+
const latestRelease = document.getElementById("latest-release");
81+
const releaseList = document.getElementById("release-list");
82+
83+
if (!latestRelease && !releaseList) {
84+
return;
85+
}
86+
87+
try {
88+
const response = await fetch(RELEASES_ENDPOINT, {
89+
cache: "no-store",
90+
headers: {
91+
Accept: "application/vnd.github+json",
92+
},
93+
});
94+
95+
if (!response.ok) {
96+
throw new Error(`HTTP ${response.status}`);
97+
}
98+
99+
const releases = (await response.json()).filter(
100+
(release) => !release.draft && !release.prerelease,
101+
);
102+
103+
if (!releases.length) {
104+
throw new Error("No public releases");
105+
}
106+
107+
const [latest] = releases;
108+
const latestTitle = latest.name || latest.tag_name;
109+
const latestStamp = formatUtcStamp(latest.published_at);
110+
111+
if (latestRelease) {
112+
latestRelease.textContent = latestStamp
113+
? `${latestTitle} · ${latestStamp}`
114+
: latestTitle;
115+
}
116+
117+
if (releaseList) {
118+
releaseList.innerHTML = releases
119+
.map((release) => {
120+
const title = escapeHtml(release.name || release.tag_name);
121+
const stamp = formatUtcStamp(release.published_at);
122+
const assetCount = Array.isArray(release.assets) ? release.assets.length : 0;
123+
const assetsText = assetCount
124+
? `包含 ${assetCount} 个下载文件`
125+
: "发布页内含当前快照下载入口";
126+
127+
return `
128+
<article class="release-item">
129+
<div class="release-item-copy">
130+
<p class="release-meta">${escapeHtml(release.tag_name)}</p>
131+
<h3>${title}</h3>
132+
<p>${stamp ? `发布时间 ${stamp},` : ""}${assetsText}。适合手动下载、回看历史版本,或通过 Watch releases 跟踪更新。</p>
133+
</div>
134+
<div class="stack-actions">
135+
<a class="button button-secondary" href="${release.html_url}">查看发布</a>
136+
</div>
137+
</article>
138+
`;
139+
})
140+
.join("");
141+
}
142+
} catch (error) {
143+
if (latestRelease) {
144+
latestRelease.textContent = "暂时无法读取最近发布记录";
145+
}
146+
147+
if (releaseList) {
148+
releaseList.innerHTML =
149+
`<p class="muted">暂时无法加载更新列表:${escapeHtml(error.message)}。你可以直接打开 GitHub Releases 查看历史快照。</p>`;
150+
}
151+
}
152+
}
153+
63154
loadStatus();
155+
loadReleases();

site/index.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ <h1 class="hero-title">免费 VPN 订阅链接与实时节点状态</h1>
4444
<div class="signal-row">
4545
<a href="https://github.com/Au1rxx/free-vpn-subscriptions/discussions/new?category=q-a">提交安装问题</a>
4646
<a href="https://github.com/Au1rxx/free-vpn-subscriptions/discussions/new?category=ideas">建议新客户端教程</a>
47+
<a href="./updates.html">查看更新记录</a>
4748
<a href="https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest">查看最新快照</a>
4849
</div>
4950
</div>
@@ -110,6 +111,32 @@ <h2>当前节点健康状态</h2>
110111
</div>
111112
</section>
112113

114+
<section class="section">
115+
<div class="section-head">
116+
<p class="eyebrow">最近更新</p>
117+
<h2>主订阅链接保持稳定,更新节奏和历史快照单独追踪。</h2>
118+
<p>
119+
客户端自动刷新依赖固定链接,所以公开订阅 URL 不应该频繁更换。想知道最近有没有新快照、状态是否波动、要不要手动下载,直接看这里。
120+
</p>
121+
</div>
122+
<div class="release-highlight">
123+
<div>
124+
<p class="eyebrow">最新发布</p>
125+
<h3 id="latest-release">正在读取最近一次快照...</h3>
126+
<p>
127+
稳定直链负责长期自动更新,Release 快照负责历史留存、手动下载和发布提醒。两者分工清楚,既不破坏客户端体验,也能形成回访理由。
128+
</p>
129+
</div>
130+
<div class="stack-actions">
131+
<a class="button button-primary" href="./updates.html">打开更新记录页</a>
132+
<a class="button button-secondary" href="https://github.com/Au1rxx/free-vpn-subscriptions/releases">打开 GitHub Releases</a>
133+
</div>
134+
</div>
135+
<div id="release-list" class="release-list">
136+
<p class="muted">正在加载最近更新...</p>
137+
</div>
138+
</section>
139+
113140
<section class="section">
114141
<div class="section-head">
115142
<p class="eyebrow">为什么这个仓库不一样</p>

site/sitemap.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
<url>
1616
<loc>https://au1rxx.github.io/free-vpn-subscriptions/status.html</loc>
1717
</url>
18+
<url>
19+
<loc>https://au1rxx.github.io/free-vpn-subscriptions/updates.html</loc>
20+
</url>
1821
<url>
1922
<loc>https://au1rxx.github.io/free-vpn-subscriptions/clash-subscription-not-working.html</loc>
2023
</url>

site/styles.css

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,54 @@ li {
299299
align-items: start;
300300
}
301301

302+
.release-highlight {
303+
display: grid;
304+
grid-template-columns: 1.3fr 0.7fr;
305+
gap: 1rem;
306+
align-items: center;
307+
padding: 1.4rem;
308+
border-radius: 28px;
309+
border: 1px solid var(--line);
310+
background: linear-gradient(180deg, rgba(15, 118, 110, 0.12), rgba(255, 255, 255, 0.82));
311+
box-shadow: var(--shadow);
312+
}
313+
314+
.release-highlight h3 {
315+
font-size: clamp(1.4rem, 2.8vw, 2rem);
316+
margin-bottom: 0.5rem;
317+
}
318+
319+
.release-list {
320+
display: grid;
321+
gap: 1rem;
322+
margin-top: 1rem;
323+
}
324+
325+
.release-item {
326+
display: grid;
327+
grid-template-columns: 1.25fr auto;
328+
gap: 1rem;
329+
align-items: center;
330+
padding: 1.3rem 1.4rem;
331+
border-radius: 24px;
332+
border: 1px solid var(--line);
333+
background: var(--surface-strong);
334+
box-shadow: var(--shadow);
335+
}
336+
337+
.release-item-copy h3 {
338+
margin-bottom: 0.4rem;
339+
}
340+
341+
.release-meta {
342+
margin: 0 0 0.45rem;
343+
font-size: 0.78rem;
344+
text-transform: uppercase;
345+
letter-spacing: 0.12em;
346+
color: var(--accent-strong);
347+
font-weight: 700;
348+
}
349+
302350
.guide-list {
303351
padding-left: 1.2rem;
304352
}
@@ -377,6 +425,8 @@ pre {
377425
.section-grid,
378426
.content-grid,
379427
.cards-three,
428+
.release-highlight,
429+
.release-item,
380430
.node-item {
381431
grid-template-columns: 1fr;
382432
}

site/updates.html

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<!doctype html>
2+
<html lang="zh-CN">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>更新记录与快照历史 | 免费 VPN 订阅</title>
7+
<meta name="description" content="查看免费 VPN 订阅的最近更新、Release 快照历史、状态入口和回访路径。主链接保持稳定,更新节奏与历史版本在这里追踪。">
8+
<link rel="canonical" href="https://au1rxx.github.io/free-vpn-subscriptions/updates.html">
9+
<meta property="og:title" content="更新记录与快照历史 | 免费 VPN 订阅">
10+
<meta property="og:description" content="主订阅链接保持稳定,最近发布、历史快照、状态变化和手动下载入口集中在这里。">
11+
<meta property="og:type" content="website">
12+
<meta property="og:url" content="https://au1rxx.github.io/free-vpn-subscriptions/updates.html">
13+
<meta property="og:image" content="https://au1rxx.github.io/free-vpn-subscriptions/social-preview.png">
14+
<meta property="og:locale" content="zh_CN">
15+
<meta name="twitter:card" content="summary_large_image">
16+
<meta name="twitter:title" content="更新记录与快照历史 | 免费 VPN 订阅">
17+
<meta name="twitter:description" content="查看最近发布的快照历史、状态入口和手动下载路径。">
18+
<meta name="twitter:image" content="https://au1rxx.github.io/free-vpn-subscriptions/social-preview.png">
19+
<link rel="stylesheet" href="./styles.css">
20+
<script type="application/ld+json">
21+
{
22+
"@context": "https://schema.org",
23+
"@type": "WebPage",
24+
"name": "更新记录与快照历史",
25+
"url": "https://au1rxx.github.io/free-vpn-subscriptions/updates.html",
26+
"description": "查看免费 VPN 订阅的最近更新、Release 快照历史、状态入口和回访路径。"
27+
}
28+
</script>
29+
</head>
30+
<body>
31+
<main class="content-page wide-page">
32+
<a class="back-link" href="./">返回首页</a>
33+
<p class="eyebrow">更新与快照</p>
34+
<h1>主订阅链接不改,更新记录、历史快照和状态变化集中看。</h1>
35+
<p class="lede">
36+
稳定订阅 URL 是给客户端长期自动刷新的,不应该为了制造回访而频繁更换。真正的回访入口应该是最近更新、历史快照、状态波动、客户端教程和问题讨论。
37+
</p>
38+
39+
<section class="content-grid">
40+
<article class="content-block">
41+
<h2>为什么主链接要稳定</h2>
42+
<ul class="faq-list">
43+
<li>客户端配置一旦保存,后续刷新依赖的是同一条订阅链接。</li>
44+
<li>频繁改链接会让旧教程、搜索结果、书签和社群转发全部失效。</li>
45+
<li>稳定入口更利于口碑传播,也更符合长期 SEO 累积。</li>
46+
</ul>
47+
</article>
48+
<article class="content-block">
49+
<h2>用户回来看什么</h2>
50+
<ul class="faq-list">
51+
<li>最近有没有新的快照发布,需不需要手动下载。</li>
52+
<li>当前节点状态是否有波动,排障前值不值得先看状态页。</li>
53+
<li>有没有新客户端教程、兼容性说明和 FAQ。</li>
54+
<li>Release 历史里是否存在更适合回滚或比对的旧快照。</li>
55+
</ul>
56+
</article>
57+
</section>
58+
59+
<section class="content-block">
60+
<p class="eyebrow">最近发布</p>
61+
<div class="release-highlight">
62+
<div>
63+
<h3 id="latest-release">正在读取最近一次快照...</h3>
64+
<p>
65+
Release 快照面向手动下载、历史回看和发布提醒;主订阅直链继续服务客户端自动刷新。两条路径分开,既稳又利于增长。
66+
</p>
67+
</div>
68+
<div class="stack-actions">
69+
<a class="button button-primary" href="https://github.com/Au1rxx/free-vpn-subscriptions/releases">打开 GitHub Releases</a>
70+
<a class="button button-secondary" href="https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest">查看最新快照详情</a>
71+
</div>
72+
</div>
73+
<div id="release-list" class="release-list">
74+
<p class="muted">正在加载最近更新...</p>
75+
</div>
76+
</section>
77+
78+
<section class="content-grid">
79+
<article class="content-block">
80+
<h2>跟踪更新的三种方式</h2>
81+
<ul class="faq-list">
82+
<li>直接把 raw 订阅链接导入客户端,适合日常自动刷新。</li>
83+
<li>关注 Releases,适合手动下载、回看历史快照或接收发布提醒。</li>
84+
<li>查看状态页和 Discussions,适合判断异常到底是节点问题还是客户端问题。</li>
85+
</ul>
86+
<div class="content-actions">
87+
<a class="button button-secondary" href="./status.html">查看状态面板</a>
88+
<a class="button button-secondary" href="https://github.com/Au1rxx/free-vpn-subscriptions/discussions">打开 Discussions</a>
89+
</div>
90+
</article>
91+
<article class="content-block">
92+
<h2>手动下载入口</h2>
93+
<p>如果你不用 raw 直链,也可以通过 latest download 固定入口拿到当前快照文件。</p>
94+
<pre><code>Clash: https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest/download/clash.yaml
95+
sing-box: https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest/download/singbox.json
96+
V2Ray: https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest/download/v2ray-base64.txt
97+
Status: https://github.com/Au1rxx/free-vpn-subscriptions/releases/latest/download/status.json</code></pre>
98+
</article>
99+
</section>
100+
</main>
101+
<script src="./app.js"></script>
102+
</body>
103+
</html>

0 commit comments

Comments
 (0)