unisecurityguard-academic-whistleblower-archive

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

UniSecurityGuard Academic Whistleblower Archive

UniSecurityGuard 学术举报归档平台

Skill by ara.so — Security Skills collection.
ara.so 提供的技能 —— 安全技能合集。

Overview

概述

UniSecurityGuard is a GitHub-based archive platform documenting the experience of a Chinese academic who transitioned from associate professor to security guard. The project serves as a censorship-resistant backup for social media content that faces institutional pressure and platform removal. It demonstrates how to use GitHub as a transparent, immutable documentation platform for whistleblowing and advocacy.
Key Use Case: Preserving evidence of academic employment issues, institutional misconduct, and career transitions when primary platforms (Xiaohongshu/Little Red Book) are threatened with censorship.
Primary Language: Markdown (documentation-focused)
Repository Structure:
  • README.md: Main narrative and updates
  • assets/: Screenshots and image evidence
  • Issues section: Community Q&A and documentation
UniSecurityGuard 是一个基于 GitHub 的归档平台,记录了一位中国学者从副教授转为保安的经历。该项目作为面临机构施压和平台删除风险的社交媒体内容的抗审查备份。它展示了如何将 GitHub 用作举报和维权的透明、不可篡改的文档平台。
核心用例:当主要平台(小红书)面临审查威胁时,保存学术就业问题、机构不当行为和职业转型的证据。
主要语言:Markdown(侧重文档)
仓库结构:
  • README.md: 主要叙事内容和更新
  • assets/: 截图和图片证据
  • Issues 板块: 社区问答和文档

Installation & Setup

安装与设置

Fork or Clone for Your Own Archive

复刻或克隆以创建你自己的归档

bash
undefined
bash
undefined

Clone the repository

Clone the repository

Create your own backup archive (fork approach)

Create your own backup archive (fork approach)

1. Fork via GitHub UI

1. Fork via GitHub UI

2. Clone your fork

2. Clone your fork

undefined
undefined

Initialize Your Own Archive

初始化你自己的归档

bash
undefined
bash
undefined

Create basic structure

Create basic structure

mkdir -p assets/{screenshots,documents,evidence} touch README.md touch TIMELINE.md touch FAQ.md
mkdir -p assets/{screenshots,documents,evidence} touch README.md touch TIMELINE.md touch FAQ.md

Initialize git

Initialize git

git init git add . git commit -m "Initial archive setup"
git init git add . git commit -m "Initial archive setup"

Push to GitHub (create repo first on github.com)

Push to GitHub (create repo first on github.com)

git remote add origin https://github.com/YOUR_USERNAME/YOUR_ARCHIVE.git git branch -M main git push -u origin main
undefined
git remote add origin https://github.com/YOUR_USERNAME/YOUR_ARCHIVE.git git branch -M main git push -u origin main
undefined

Core Patterns

核心模式

1. Document Progressive Updates

1. 记录渐进式更新

The project uses the README.md as a chronological narrative with new updates at the top:
markdown
undefined
项目将 README.md 用作按时间顺序排列的叙事文档,最新更新置于顶部:
markdown
undefined

[Latest Update - Critical Situation]

[最新更新 - 关键情况]

[Date]: Current Status

[日期]: 当前状态

Description of latest developments...
最新进展描述...

[Earlier Date]: Previous Situation

[更早日期]: 之前情况

Earlier context...
更早背景...

Background

背景

Original story and context...
undefined
原始故事与背景...
undefined

2. Asset Organization

2. 资源组织

Store evidence systematically:
bash
assets/
├── screenshots/
│   ├── 1.jpg          # Numbered chronologically
│   ├── 2.jpg
│   └── 3.jpg
├── documents/
│   ├── contract.pdf
│   └── correspondence.pdf
└── evidence/
    ├── salary_records/
    └── institutional_communications/
系统地存储证据:
bash
assets/
├── screenshots/
│   ├── 1.jpg          # 按时间顺序编号
│   ├── 2.jpg
│   └── 3.jpg
├── documents/
│   ├── contract.pdf
│   └── correspondence.pdf
└── evidence/
    ├── salary_records/
    └── institutional_communications/

3. Embed Images in README

3. 在 README 中嵌入图片

markdown
undefined
markdown
undefined

Evidence Documentation

证据记录

<img src="assets/screenshots/1.jpg" width="400" alt="Description of evidence"> <img src="assets/screenshots/2.jpg" width="400" alt="Context"> <img src="assets/screenshots/3.jpg" width="400" alt="Timeline proof"> ```
<img src="assets/screenshots/1.jpg" width="400" alt="证据描述"> <img src="assets/screenshots/2.jpg" width="400" alt="背景"> <img src="assets/screenshots/3.jpg" width="400" alt="时间线证明"> ```

4. Use Issues for FAQ and Community Support

4. 使用 Issues 实现 FAQ 和社区支持

The project uses 154+ issues as a documentation and Q&A system:
markdown
undefined
项目利用 154+ 个 Issues 作为文档和问答系统:
markdown
undefined

Create structured issues for common questions

为常见问题创建结构化 Issues

Issue #1: "关于学校施压的详细情况" (Details about institutional pressure) Issue #2: "如何保护自己在类似情况下" (How to protect yourself in similar situations) Issue #3: "法律建议和资源" (Legal advice and resources)
undefined
Issue #1: "关于学校施压的详细情况" (Details about institutional pressure) Issue #2: "如何保护自己在类似情况下" (How to protect yourself in similar situations) Issue #3: "法律建议和资源" (Legal advice and resources)
undefined

Real-World Implementation Examples

实际应用示例

Example 1: Creating a Censorship-Resistant Archive

示例 1:创建抗审查归档

bash
#!/bin/bash
bash
#!/bin/bash

backup_social_media.sh

backup_social_media.sh

Automate archiving of social media content to GitHub

Automate archiving of social media content to GitHub

ARCHIVE_DIR="./archive/$(date +%Y-%m-%d)" mkdir -p "$ARCHIVE_DIR"
ARCHIVE_DIR="./archive/$(date +%Y-%m-%d)" mkdir -p "$ARCHIVE_DIR"

Download screenshots (manual or automated via APIs)

Download screenshots (manual or automated via APIs)

Save to archive directory

Save to archive directory

cp ~/Downloads/xiaohongshu_screenshots/* "$ARCHIVE_DIR/"
cp ~/Downloads/xiaohongshu_screenshots/* "$ARCHIVE_DIR/"

Create daily update

Create daily update

cat > "$ARCHIVE_DIR/update.md" << EOF
cat > "$ARCHIVE_DIR/update.md" << EOF

Update: $(date +%Y-%m-%d)

Update: $(date +%Y-%m-%d)

Status

Status

  • Platform status: [Active/Restricted/Removed]
  • Follower count: [NUMBER]
  • Content removed: [YES/NO]
  • Platform status: [Active/Restricted/Removed]
  • Follower count: [NUMBER]
  • Content removed: [YES/NO]

New Developments

New Developments

[Description]
[Description]

Evidence

Evidence

$(ls "$ARCHIVE_DIR"/*.jpg | sed 's/^/- /') EOF
$(ls "$ARCHIVE_DIR"/*.jpg | sed 's/^/- /') EOF

Commit to git

Commit to git

git add "$ARCHIVE_DIR" git commit -m "Archive update: $(date +%Y-%m-%d)" git push origin main
undefined
git add "$ARCHIVE_DIR" git commit -m "Archive update: $(date +%Y-%m-%d)" git push origin main
undefined

Example 2: Structured Timeline Documentation

示例 2:结构化时间线记录

Create
TIMELINE.md
:
markdown
undefined
创建
TIMELINE.md
:
markdown
undefined

Career Transition Timeline

职业转型时间线

2025-12-27: Repository Created

2025-12-27: 仓库创建

  • Initial backup platform established
  • 3 key screenshots archived
  • Background story documented
  • 建立初始备份平台
  • 归档 3 张关键截图
  • 记录背景故事

2025-12: Institutional Pressure Begins

2025-12: 机构施压开始

  • 7 leaders visit rental apartment
  • Demands to delete content and claim fiction
  • Threats to reclaim salary and benefits
  • 7 位领导到访出租公寓
  • 要求删除内容并声称是虚构
  • 威胁收回薪资和福利

2025: Security Guard Transition

2025: 转为保安

  • Removed from associate professor position
  • Transferred to campus security
  • Salary: ¥4,000/month base + ¥800 security supplement
  • Annual performance bonus: ¥6,000+
  • 被免去副教授职位
  • 调至校园保安岗位
  • 薪资:每月基础工资 ¥4000 + ¥800 保安补贴
  • 年度绩效奖金:¥6000+

Background: Academic Career

背景:学术生涯

  • Undergraduate: C9 university (华五)
  • PhD: QS50 US university (withdrawn)
  • Position: Associate professor at brother institution
undefined
  • 本科:C9 高校(华五)
  • 博士:QS50 美国高校(退学)
  • 职位:兄弟院校副教授
undefined

Example 3: README Template for Academic Whistleblowing

示例 3:学术举报 README 模板

markdown
undefined
markdown
undefined

[Project Title]: Academic Employment Transparency

[项目标题]: 学术就业透明度

⚠️ Current Situation

⚠️ 当前情况

[Latest critical update - always at top]
[最新关键更新 - 始终置于顶部]

Background

背景

Academic Credentials

学术资质

  • Undergraduate: [Institution]
  • Graduate: [Institution]
  • Position: [Title] at [Institution]
  • 本科: [院校]
  • 研究生: [院校]
  • 职位: [职称] @ [院校]

Employment Transition

职业转型

  • Previous role: [Title], Salary: [Amount]
  • Current role: [Title], Salary: [Amount]
  • Reason for transition: [Description]
  • 之前职位: [职称], 薪资: [金额]
  • 当前职位: [职称], 薪资: [金额]
  • 转型原因: [描述]

Institutional Response

机构回应

Pressure Tactics

施压手段

  1. [Specific action]
  2. [Specific threat]
  3. [Specific demand]
  1. [具体行为]
  2. [具体威胁]
  3. [具体要求]

Evidence

证据

<img src="assets/evidence_1.jpg" width="400" alt="Evidence description">
<img src="assets/evidence_1.jpg" width="400" alt="证据描述">

Documentation Purpose

文档目的

This repository serves as:
  1. Immutable record of events
  2. Backup for censored social media content
  3. Resource for others in similar situations
  4. Transparent accountability mechanism
本仓库用作:
  1. 事件的不可篡改记录
  2. 被审查社交媒体内容的备份
  3. 类似情况人群的参考资源
  4. 透明问责机制

How to Support

如何支持

  • ⭐ Star this repository for visibility
  • 📋 Open issues with questions or similar experiences
  • 🔄 Share (carefully, considering safety)
  • 📸 Screenshot and archive content locally
undefined
  • ⭐ 给本仓库点赞以提升曝光
  • 📋 提交 Issues 提出问题或分享类似经历
  • 🔄 谨慎分享(考虑安全因素)
  • 📸 截图并本地归档内容
undefined

Example 4: Automated Git Backup Script

示例 4:自动化 Git 备份脚本

python
#!/usr/bin/env python3
python
#!/usr/bin/env python3

auto_archive.py - Automated content archiving

auto_archive.py - Automated content archiving

import os import json from datetime import datetime import subprocess
class AcademicArchive: def init(self, repo_path): self.repo_path = repo_path self.assets_dir = os.path.join(repo_path, 'assets')
def add_update(self, title, content, evidence_files=None):
    """Add new update to README"""
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M')
    
    update = f"\n# {title}\n\n"
    update += f"**Date**: {timestamp}\n\n"
    update += f"{content}\n\n"
    
    if evidence_files:
        update += "## Evidence\n\n"
        for f in evidence_files:
            # Copy evidence to assets
            dest = os.path.join(self.assets_dir, os.path.basename(f))
            subprocess.run(['cp', f, dest])
            update += f'<img src="assets/{os.path.basename(f)}" width="400" alt="">\n'
    
    # Prepend to README
    readme_path = os.path.join(self.repo_path, 'README.md')
    with open(readme_path, 'r') as f:
        existing = f.read()
    
    with open(readme_path, 'w') as f:
        f.write(update + existing)
    
    return update

def commit_and_push(self, message):
    """Commit changes and push to GitHub"""
    os.chdir(self.repo_path)
    subprocess.run(['git', 'add', '.'])
    subprocess.run(['git', 'commit', '-m', message])
    subprocess.run(['git', 'push', 'origin', 'main'])

def create_issue_faq(self, question, answer):
    """Create issue for FAQ (requires GitHub CLI)"""
    subprocess.run([
        'gh', 'issue', 'create',
        '--title', question,
        '--body', answer,
        '--label', 'faq'
    ])
import os import json from datetime import datetime import subprocess
class AcademicArchive: def init(self, repo_path): self.repo_path = repo_path self.assets_dir = os.path.join(repo_path, 'assets')
def add_update(self, title, content, evidence_files=None):
    """Add new update to README"""
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M')
    
    update = f"\n# {title}\n\n"
    update += f"**Date**: {timestamp}\n\n"
    update += f"{content}\n\n"
    
    if evidence_files:
        update += "## Evidence\n\n"
        for f in evidence_files:
            # Copy evidence to assets
            dest = os.path.join(self.assets_dir, os.path.basename(f))
            subprocess.run(['cp', f, dest])
            update += f'<img src="assets/{os.path.basename(f)}" width="400" alt="">\n'
    
    # Prepend to README
    readme_path = os.path.join(self.repo_path, 'README.md')
    with open(readme_path, 'r') as f:
        existing = f.read()
    
    with open(readme_path, 'w') as f:
        f.write(update + existing)
    
    return update

def commit_and_push(self, message):
    """Commit changes and push to GitHub"""
    os.chdir(self.repo_path)
    subprocess.run(['git', 'add', '.'])
    subprocess.run(['git', 'commit', '-m', message])
    subprocess.run(['git', 'push', 'origin', 'main'])

def create_issue_faq(self, question, answer):
    """Create issue for FAQ (requires GitHub CLI)"""
    subprocess.run([
        'gh', 'issue', 'create',
        '--title', question,
        '--body', answer,
        '--label', 'faq'
    ])

Usage example

Usage example

archive = AcademicArchive('/path/to/UniSecurityGuard')
archive = AcademicArchive('/path/to/UniSecurityGuard')

Add update with evidence

Add update with evidence

archive.add_update( title="Latest Institutional Pressure", content=""" School leadership removed the chair from security booth. Reason: "Security guards shouldn't sit - it doesn't look proper." Now standing 8 hours straight daily. """, evidence_files=[ '/path/to/screenshots/booth_before.jpg', '/path/to/screenshots/booth_after.jpg' ] )
archive.commit_and_push("Update: Security booth chair removed")
undefined
archive.add_update( title="Latest Institutional Pressure", content=""" School leadership removed the chair from security booth. Reason: "Security guards shouldn't sit - it doesn't look proper." Now standing 8 hours straight daily. """, evidence_files=[ '/path/to/screenshots/booth_before.jpg', '/path/to/screenshots/booth_after.jpg' ] )
archive.commit_and_push("Update: Security booth chair removed")
undefined

Configuration & Best Practices

配置与最佳实践

Repository Settings

仓库设置

  1. Enable GitHub Pages (optional, for web presence):
    • Settings → Pages → Source: main branch
    • Creates public website at
      https://USERNAME.github.io/REPO
  2. Issue Templates:
Create
.github/ISSUE_TEMPLATE/faq.md
:
markdown
---
name: FAQ Question
about: Ask questions about the situation
title: '[FAQ] '
labels: faq
---
  1. 启用 GitHub Pages(可选,用于网页展示):
    • 设置 → Pages → 源:main 分支
    • 创建公共网站,地址为
      https://USERNAME.github.io/REPO
  2. Issue 模板:
创建
.github/ISSUE_TEMPLATE/faq.md
:
markdown
---
name: FAQ Question
about: Ask questions about the situation
title: '[FAQ] '
labels: faq
---

Question

Question

[Your question]
[Your question]

Context (if applicable)

Context (if applicable)

[Additional context]

3. **Archive Metadata**:

Create `archive_metadata.json`:

```json
{
  "archive_name": "UniSecurityGuard",
  "primary_platform": "Xiaohongshu (Little Red Book)",
  "backup_date": "2025-12-27",
  "last_update": "2026-05-13",
  "status": "active",
  "content_type": "academic_whistleblowing",
  "language": "zh-CN",
  "evidence_count": 154,
  "follower_snapshot": {
    "platform": "xiaohongshu",
    "count": "unknown",
    "status": "threatened"
  }
}
[Additional context]

3. **归档元数据**:

创建 `archive_metadata.json`:

```json
{
  "archive_name": "UniSecurityGuard",
  "primary_platform": "Xiaohongshu (Little Red Book)",
  "backup_date": "2025-12-27",
  "last_update": "2026-05-13",
  "status": "active",
  "content_type": "academic_whistleblowing",
  "language": "zh-CN",
  "evidence_count": 154,
  "follower_snapshot": {
    "platform": "xiaohongshu",
    "count": "unknown",
    "status": "threatened"
  }
}

Safety Considerations

安全注意事项

  1. Anonymization: Remove or redact:
    • Personal identifying information of third parties
    • Specific institutional names (if legally required)
    • Location details that enable physical tracking
  2. Evidence Integrity:
    bash
    # Generate checksums for evidence files
    sha256sum assets/**/*.jpg > assets/checksums.txt
    git add assets/checksums.txt
    git commit -m "Add evidence checksums for integrity verification"
  3. Backup Beyond GitHub:
    bash
    # Create encrypted backup archive
    tar -czf archive_backup.tar.gz .
    gpg --symmetric --cipher-algo AES256 archive_backup.tar.gz
    # Store archive_backup.tar.gz.gpg in multiple locations
  1. 匿名化:移除或编辑:
    • 第三方个人识别信息
    • 特定机构名称(若有法律要求)
    • 可用于物理追踪的位置细节
  2. 证据完整性:
    bash
    # Generate checksums for evidence files
    sha256sum assets/**/*.jpg > assets/checksums.txt
    git add assets/checksums.txt
    git commit -m "Add evidence checksums for integrity verification"
  3. GitHub 之外的备份:
    bash
    # Create encrypted backup archive
    tar -czf archive_backup.tar.gz .
    gpg --symmetric --cipher-algo AES256 archive_backup.tar.gz
    # Store archive_backup.tar.gz.gpg in multiple locations

Common Use Cases

常见用例

Migrating from Censored Platform

从被审查平台迁移

markdown
undefined
markdown
undefined

Platform Migration Notice

平台迁移通知

Due to [PLATFORM] censorship/removal, this content has migrated to GitHub.
Original platform: [NAME] Original account: [HANDLE/ID] Migration date: [DATE] Reason: [Platform pressure/content removal/account suspension]
因[平台]审查/删除,内容已迁移至 GitHub。
原平台: [名称] 原账号: [用户名/ID] 迁移日期: [日期] 原因: [平台施压/内容删除/账号封禁]

How to Follow Updates

如何关注更新

  1. ⭐ Star this repository
  2. 👁️ Watch → All Activity (for notifications)
  3. Check back regularly or use RSS feed:
    https://github.com/USERNAME/REPO/commits/main.atom
undefined
  1. ⭐ 给本仓库点赞
  2. 👁️ 关注 → 所有活动(获取通知)
  3. 定期查看或使用 RSS 订阅:
    https://github.com/USERNAME/REPO/commits/main.atom
undefined

Community Support Hub

社区支持中心

markdown
undefined
markdown
undefined

Support & Resources

支持与资源

For Those in Similar Situations

针对类似情况人群

Legal & Safety Resources

法律与安全资源

  • [Labor law consultation contacts]
  • [Academic employment advocacy organizations]
  • [Digital security guides]
undefined
  • [劳动法咨询联系方式]
  • [学术就业维权组织]
  • [数字安全指南]
undefined

Troubleshooting

故障排除

Issue: Content Visibility

问题:内容可见性

Problem: Updates not appearing to others
bash
undefined
问题: 更新未对他人显示
bash
undefined

Verify commits are pushed

Verify commits are pushed

git status git log --oneline -5
git status git log --oneline -5

Force push if necessary (use cautiously)

Force push if necessary (use cautiously)

git push --force origin main
undefined
git push --force origin main
undefined

Issue: Large Files

问题:大文件

Problem: Screenshots/documents exceed GitHub limits (100MB file, 1GB repo)
bash
undefined
问题: 截图/文档超出 GitHub 限制(单文件 100MB,仓库 1GB)
bash
undefined

Use Git LFS for large files

Use Git LFS for large files

git lfs install git lfs track ".pdf" git lfs track ".mp4" git add .gitattributes git commit -m "Configure Git LFS"
git lfs install git lfs track ".pdf" git lfs track ".mp4" git add .gitattributes git commit -m "Configure Git LFS"

Or link to external storage

Or link to external storage

echo "Large evidence files: [External Archive Link]" >> README.md
undefined
echo "Large evidence files: [External Archive Link]" >> README.md
undefined

Issue: Institutional Takedown Requests

问题:机构下架请求

GitHub provides:
  1. DMCA counter-notice process
  2. Transparency reports for takedown requests
  3. Archive repositories before potential removal
bash
undefined
GitHub 提供:
  1. DMCA 反通知流程
  2. 下架请求透明度报告
  3. 潜在删除前归档仓库
bash
undefined

Create redundant mirrors

Create redundant mirrors

undefined
undefined

Issue: Community Management

问题:社区管理

High issue volume (154+ issues):
bash
undefined
Issue 数量过多(154+ 个):
bash
undefined

Use labels effectively

Use labels effectively

gh label create "institutional-pressure" --color "d73a4a" gh label create "legal-advice" --color "0075ca" gh label create "career-advice" --color "008672"
gh label create "institutional-pressure" --color "d73a4a" gh label create "legal-advice" --color "0075ca" gh label create "career-advice" --color "008672"

Bulk label issues

Bulk label issues

gh issue list --limit 100 --json number --jq '.[].number' |
xargs -I {} gh issue edit {} --add-label "faq"
undefined
gh issue list --limit 100 --json number --jq '.[].number' |
xargs -I {} gh issue edit {} --add-label "faq"
undefined

Advanced Patterns

进阶模式

Automated Monitoring

自动化监控

python
undefined
python
undefined

monitor_platform.py - Check if primary platform content is still accessible

monitor_platform.py - Check if primary platform content is still accessible

import requests import json from datetime import datetime
def check_platform_status(platform_url): """Monitor if content is still accessible""" try: response = requests.get(platform_url, timeout=10) status = { 'timestamp': datetime.now().isoformat(), 'accessible': response.status_code == 200, 'status_code': response.status_code } except Exception as e: status = { 'timestamp': datetime.now().isoformat(), 'accessible': False, 'error': str(e) }
# Log status
with open('platform_status.jsonl', 'a') as f:
    f.write(json.dumps(status) + '\n')

return status
import requests import json from datetime import datetime
def check_platform_status(platform_url): """Monitor if content is still accessible""" try: response = requests.get(platform_url, timeout=10) status = { 'timestamp': datetime.now().isoformat(), 'accessible': response.status_code == 200, 'status_code': response.status_code } except Exception as e: status = { 'timestamp': datetime.now().isoformat(), 'accessible': False, 'error': str(e) }
# Log status
with open('platform_status.jsonl', 'a') as f:
    f.write(json.dumps(status) + '\n')

return status

Run periodically via cron

Run periodically via cron

0 */6 * * * /usr/bin/python3 /path/to/monitor_platform.py

0 */6 * * * /usr/bin/python3 /path/to/monitor_platform.py

undefined
undefined

RSS Feed for Followers

面向关注者的 RSS 订阅

GitHub automatically provides RSS feeds:
undefined
GitHub 自动提供 RSS 订阅源:
undefined

Commits feed

提交记录订阅源

Issues feed

Issues 订阅源

Share with followers

分享给关注者

"Subscribe to updates: Add this URL to your RSS reader"

This skill enables AI agents to help users create censorship-resistant documentation platforms, archive evidence of institutional misconduct, and maintain transparency when facing content removal pressure.
"订阅更新:将此 URL 添加到你的 RSS 阅读器"

该技能可让 AI Agent 帮助用户创建抗审查文档平台、归档机构不当行为证据,并在面临内容删除压力时保持透明度。