6 changed files with 833 additions and 7 deletions
@ -0,0 +1,636 @@ |
|||||||
|
# GitRepublic Tutorial & Walkthrough |
||||||
|
|
||||||
|
Welcome to GitRepublic! This comprehensive guide will walk you through everything you need to know to get started with decentralized git hosting on Nostr. |
||||||
|
|
||||||
|
## Table of Contents |
||||||
|
|
||||||
|
1. [What is GitRepublic?](#what-is-gitrepublic) |
||||||
|
2. [Getting Started](#getting-started) |
||||||
|
3. [Creating Your First Repository](#creating-your-first-repository) |
||||||
|
4. [Cloning Repositories](#cloning-repositories) |
||||||
|
5. [Making Changes and Pushing](#making-changes-and-pushing) |
||||||
|
6. [Pull Requests](#pull-requests) |
||||||
|
7. [Issues](#issues) |
||||||
|
8. [Forking Repositories](#forking-repositories) |
||||||
|
9. [Repository Settings](#repository-settings) |
||||||
|
10. [Collaboration Features](#collaboration-features) |
||||||
|
11. [Best Practices](#best-practices) |
||||||
|
12. [Troubleshooting](#troubleshooting) |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## What is GitRepublic? |
||||||
|
|
||||||
|
GitRepublic is a decentralized git hosting platform built on Nostr. Unlike traditional git hosting services, GitRepublic: |
||||||
|
|
||||||
|
- **No central authority**: Your repositories are announced on Nostr relays, making them truly decentralized |
||||||
|
- **Nostr-based authentication**: Uses NIP-07 (browser extensions) and NIP-98 (HTTP authentication) for secure access |
||||||
|
- **Full control**: You own your repositories and can transfer ownership, manage maintainers, and control access |
||||||
|
- **Open collaboration**: Create pull requests, issues, and collaborate with others using Nostr events |
||||||
|
|
||||||
|
### Key Concepts |
||||||
|
|
||||||
|
- **NIP-34**: The Nostr Improvement Proposal that defines how repositories are announced and managed |
||||||
|
- **NIP-07**: Browser extension authentication (like Alby or nos2x) |
||||||
|
- **NIP-98**: HTTP authentication for git operations (clone, push, pull) |
||||||
|
- **Repository Announcements**: Nostr events (kind 30617) that announce your repository to the network |
||||||
|
- **Ownership Transfer**: Chain of ownership events (kind 1641) that prove repository ownership |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Getting Started |
||||||
|
|
||||||
|
### Prerequisites |
||||||
|
|
||||||
|
Before you begin, you'll need: |
||||||
|
|
||||||
|
1. **A Nostr key pair**: You can generate one using a NIP-07 browser extension |
||||||
|
2. **NIP-07 Extension**: Install [Alby](https://getalby.com/) or [nos2x](https://github.com/fiatjaf/nos2x) in your browser |
||||||
|
3. **Git installed**: Make sure you have git installed on your system |
||||||
|
4. **Access to GitRepublic**: Visit the GitRepublic instance you want to use |
||||||
|
|
||||||
|
### Step 1: Install NIP-07 Extension |
||||||
|
|
||||||
|
1. Install a Nostr browser extension: |
||||||
|
- **Alby**: [getalby.com](https://getalby.com/) |
||||||
|
- **nos2x**: Available for Chrome/Firefox |
||||||
|
|
||||||
|
2. Create or import your Nostr key pair in the extension |
||||||
|
|
||||||
|
3. Make sure the extension is active and unlocked |
||||||
|
|
||||||
|
### Step 2: Connect to GitRepublic |
||||||
|
|
||||||
|
1. Visit the GitRepublic homepage |
||||||
|
2. Click the **Login** button in the top right |
||||||
|
3. Approve the connection request in your NIP-07 extension |
||||||
|
4. You should now see your user badge in the header |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Creating Your First Repository |
||||||
|
|
||||||
|
### Using the Web Interface |
||||||
|
|
||||||
|
1. **Navigate to Sign Up**: Click "Sign Up" in the navigation menu |
||||||
|
|
||||||
|
2. **Fill in Repository Details**: |
||||||
|
- **Repository Name**: Choose a unique name (e.g., `my-awesome-project`) |
||||||
|
- **Description**: Add a description of what your repository does |
||||||
|
- **Clone URLs** (optional): If you're migrating from another git host, add the clone URLs here |
||||||
|
- **Private** (optional): Check this if you want a private repository |
||||||
|
|
||||||
|
3. **Create Repository**: Click the create button |
||||||
|
|
||||||
|
4. **What Happens Next**: |
||||||
|
- GitRepublic creates a Nostr event announcing your repository |
||||||
|
- A bare git repository is automatically provisioned |
||||||
|
- You'll be redirected to your new repository page |
||||||
|
|
||||||
|
### Repository URL Structure |
||||||
|
|
||||||
|
Your repository will be accessible at: |
||||||
|
``` |
||||||
|
https://{domain}/repos/{your-npub}/{repository-name} |
||||||
|
``` |
||||||
|
|
||||||
|
For git operations: |
||||||
|
``` |
||||||
|
https://{domain}/{your-npub}/{repository-name}.git |
||||||
|
``` |
||||||
|
|
||||||
|
### Initial Setup |
||||||
|
|
||||||
|
After creating your repository, you can: |
||||||
|
|
||||||
|
1. **Clone it locally**: |
||||||
|
```bash |
||||||
|
git clone https://{domain}/{your-npub}/{repository-name}.git |
||||||
|
cd {repository-name} |
||||||
|
``` |
||||||
|
|
||||||
|
2. **Add your first files**: |
||||||
|
```bash |
||||||
|
echo "# My Awesome Project" > README.md |
||||||
|
git add README.md |
||||||
|
git commit -m "Initial commit" |
||||||
|
git push origin main |
||||||
|
``` |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Cloning Repositories |
||||||
|
|
||||||
|
### Public Repositories |
||||||
|
|
||||||
|
Anyone can clone public repositories without authentication: |
||||||
|
|
||||||
|
```bash |
||||||
|
git clone https://{domain}/{owner-npub}/{repository-name}.git |
||||||
|
cd {repository-name} |
||||||
|
``` |
||||||
|
|
||||||
|
### Private Repositories |
||||||
|
|
||||||
|
Private repositories require authentication. You'll need to set up NIP-98 authentication. |
||||||
|
|
||||||
|
#### Setting Up NIP-98 Authentication |
||||||
|
|
||||||
|
1. **Install a git credential helper** (if not already installed): |
||||||
|
```bash |
||||||
|
# For Linux/Mac |
||||||
|
git config --global credential.helper store |
||||||
|
``` |
||||||
|
|
||||||
|
2. **Configure git to use NIP-98**: |
||||||
|
```bash |
||||||
|
git config --global credential.https://{domain}.helper '!f() { echo "username=nostr"; echo "password=$(nostr-auth-token)"; }; f' |
||||||
|
``` |
||||||
|
|
||||||
|
Note: You may need a custom credential helper that generates NIP-98 auth tokens. Check the GitRepublic documentation for your specific setup. |
||||||
|
|
||||||
|
3. **Clone the private repository**: |
||||||
|
```bash |
||||||
|
git clone https://{domain}/{owner-npub}/{repository-name}.git |
||||||
|
``` |
||||||
|
|
||||||
|
When prompted, the credential helper will automatically generate and use a NIP-98 authentication token. |
||||||
|
|
||||||
|
### Cloning from Multiple Remotes |
||||||
|
|
||||||
|
If a repository has multiple clone URLs configured, GitRepublic will automatically sync changes to all remotes when you push. You can see all clone URLs on the repository page. |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Making Changes and Pushing |
||||||
|
|
||||||
|
### Basic Workflow |
||||||
|
|
||||||
|
1. **Make changes to your files**: |
||||||
|
```bash |
||||||
|
echo "New feature" >> README.md |
||||||
|
``` |
||||||
|
|
||||||
|
2. **Stage your changes**: |
||||||
|
```bash |
||||||
|
git add README.md |
||||||
|
``` |
||||||
|
|
||||||
|
3. **Commit your changes**: |
||||||
|
```bash |
||||||
|
git commit -m "Add new feature" |
||||||
|
``` |
||||||
|
|
||||||
|
4. **Push to GitRepublic**: |
||||||
|
```bash |
||||||
|
git push origin main |
||||||
|
``` |
||||||
|
|
||||||
|
### Authentication for Push |
||||||
|
|
||||||
|
When you push, GitRepublic will: |
||||||
|
|
||||||
|
1. Verify your NIP-98 authentication token |
||||||
|
2. Check that you're the repository owner or a maintainer |
||||||
|
3. Verify the repository size limit (2 GB maximum) |
||||||
|
4. Process your push |
||||||
|
5. Automatically sync to other remotes (if configured) |
||||||
|
|
||||||
|
### Branch Management |
||||||
|
|
||||||
|
#### Creating a New Branch |
||||||
|
|
||||||
|
```bash |
||||||
|
git checkout -b feature/new-feature |
||||||
|
# Make changes |
||||||
|
git add . |
||||||
|
git commit -m "Add new feature" |
||||||
|
git push origin feature/new-feature |
||||||
|
``` |
||||||
|
|
||||||
|
#### Viewing Branches |
||||||
|
|
||||||
|
You can view all branches: |
||||||
|
- On the repository web page |
||||||
|
- Using the API: `GET /api/repos/{npub}/{repo}/branches` |
||||||
|
|
||||||
|
#### Creating Branches via Web UI |
||||||
|
|
||||||
|
1. Navigate to your repository |
||||||
|
2. Click "Create Branch" |
||||||
|
3. Enter branch name and select the source branch |
||||||
|
4. Click "Create" |
||||||
|
|
||||||
|
### Tags |
||||||
|
|
||||||
|
#### Creating a Tag |
||||||
|
|
||||||
|
```bash |
||||||
|
git tag -a v1.0.0 -m "Release version 1.0.0" |
||||||
|
git push origin v1.0.0 |
||||||
|
``` |
||||||
|
|
||||||
|
#### Creating Tags via Web UI |
||||||
|
|
||||||
|
1. Navigate to your repository |
||||||
|
2. Click "Create Tag" |
||||||
|
3. Enter tag name, select commit, and add a message |
||||||
|
4. Click "Create" |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Pull Requests |
||||||
|
|
||||||
|
Pull requests (PRs) allow you to propose changes to a repository. They're created as Nostr events (kind 1618) and can be reviewed, commented on, and merged. |
||||||
|
|
||||||
|
### Creating a Pull Request |
||||||
|
|
||||||
|
#### Method 1: Via Web Interface |
||||||
|
|
||||||
|
1. **Fork the repository** (if you don't have write access) |
||||||
|
2. **Make your changes** in your fork |
||||||
|
3. **Push your changes** to a branch |
||||||
|
4. **Navigate to the original repository** |
||||||
|
5. **Click "Create Pull Request"** |
||||||
|
6. **Fill in the details**: |
||||||
|
- Source repository and branch |
||||||
|
- Target repository and branch |
||||||
|
- Title and description |
||||||
|
7. **Submit the PR** |
||||||
|
|
||||||
|
#### Method 2: Using Git and Nostr |
||||||
|
|
||||||
|
1. **Fork and clone the repository**: |
||||||
|
```bash |
||||||
|
git clone https://{domain}/{owner-npub}/{repo}.git |
||||||
|
cd {repo} |
||||||
|
``` |
||||||
|
|
||||||
|
2. **Create a feature branch**: |
||||||
|
```bash |
||||||
|
git checkout -b feature/my-feature |
||||||
|
``` |
||||||
|
|
||||||
|
3. **Make your changes and push**: |
||||||
|
```bash |
||||||
|
# Make changes |
||||||
|
git add . |
||||||
|
git commit -m "Add new feature" |
||||||
|
git push origin feature/my-feature |
||||||
|
``` |
||||||
|
|
||||||
|
4. **Create a PR event** using a Nostr client or the web interface |
||||||
|
|
||||||
|
### Reviewing Pull Requests |
||||||
|
|
||||||
|
1. **Navigate to the repository** |
||||||
|
2. **Click on "Pull Requests"** |
||||||
|
3. **Select a PR to review** |
||||||
|
4. **Review the changes** in the diff view |
||||||
|
5. **Add comments** on specific lines or sections |
||||||
|
6. **Approve or request changes** |
||||||
|
|
||||||
|
### PR Status |
||||||
|
|
||||||
|
Pull requests can have the following statuses: |
||||||
|
|
||||||
|
- **Open**: The PR is active and ready for review |
||||||
|
- **Applied/Merged**: The PR has been merged into the target branch |
||||||
|
- **Closed**: The PR was closed without merging |
||||||
|
- **Draft**: The PR is still a work in progress |
||||||
|
|
||||||
|
### Merging Pull Requests |
||||||
|
|
||||||
|
Only repository owners and maintainers can merge PRs: |
||||||
|
|
||||||
|
1. **Review the PR** and ensure all checks pass |
||||||
|
2. **Click "Merge"** or change the status to "Applied" |
||||||
|
3. **The changes will be merged** into the target branch |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Issues |
||||||
|
|
||||||
|
Issues (kind 1621) allow you to track bugs, feature requests, and other tasks related to your repository. |
||||||
|
|
||||||
|
### Creating an Issue |
||||||
|
|
||||||
|
1. **Navigate to your repository** |
||||||
|
2. **Click "Issues"** in the repository menu |
||||||
|
3. **Click "Create Issue"** |
||||||
|
4. **Fill in the details**: |
||||||
|
- Title |
||||||
|
- Description |
||||||
|
- Labels (optional) |
||||||
|
5. **Submit the issue** |
||||||
|
|
||||||
|
### Issue Status |
||||||
|
|
||||||
|
Issues can have the following statuses: |
||||||
|
|
||||||
|
- **Open**: The issue is active and needs attention |
||||||
|
- **Resolved**: The issue has been fixed or addressed |
||||||
|
- **Closed**: The issue was closed (e.g., duplicate, won't fix) |
||||||
|
- **Draft**: The issue is still being written |
||||||
|
|
||||||
|
### Managing Issues |
||||||
|
|
||||||
|
- **Assign issues** to maintainers |
||||||
|
- **Add comments** to discuss solutions |
||||||
|
- **Link issues to PRs** by referencing them in PR descriptions |
||||||
|
- **Close issues** when they're resolved |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Forking Repositories |
||||||
|
|
||||||
|
Forking creates your own copy of a repository that you can modify independently. |
||||||
|
|
||||||
|
### How to Fork |
||||||
|
|
||||||
|
1. **Navigate to the repository** you want to fork |
||||||
|
2. **Click the "Fork" button** |
||||||
|
3. **GitRepublic will**: |
||||||
|
- Create a copy of the repository under your account |
||||||
|
- Create a new NIP-34 announcement for your fork |
||||||
|
- Set you as the owner of the fork |
||||||
|
- Add a reference to the original repository |
||||||
|
|
||||||
|
### Working with Forks |
||||||
|
|
||||||
|
After forking: |
||||||
|
|
||||||
|
1. **Clone your fork**: |
||||||
|
```bash |
||||||
|
git clone https://{domain}/{your-npub}/{fork-name}.git |
||||||
|
``` |
||||||
|
|
||||||
|
2. **Make changes** in your fork |
||||||
|
|
||||||
|
3. **Push changes**: |
||||||
|
```bash |
||||||
|
git push origin main |
||||||
|
``` |
||||||
|
|
||||||
|
4. **Create a pull request** back to the original repository (if you want to contribute) |
||||||
|
|
||||||
|
### Syncing with Upstream |
||||||
|
|
||||||
|
To keep your fork up to date with the original repository: |
||||||
|
|
||||||
|
1. **Add the original as a remote**: |
||||||
|
```bash |
||||||
|
git remote add upstream https://{domain}/{original-npub}/{original-repo}.git |
||||||
|
``` |
||||||
|
|
||||||
|
2. **Fetch and merge**: |
||||||
|
```bash |
||||||
|
git fetch upstream |
||||||
|
git merge upstream/main |
||||||
|
git push origin main |
||||||
|
``` |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Repository Settings |
||||||
|
|
||||||
|
Access repository settings by clicking "Settings" on your repository page. |
||||||
|
|
||||||
|
### Privacy Settings |
||||||
|
|
||||||
|
- **Public**: Anyone can view and clone your repository |
||||||
|
- **Private**: Only owners and maintainers can access |
||||||
|
|
||||||
|
### Maintainer Management |
||||||
|
|
||||||
|
Add maintainers who can: |
||||||
|
- Push to the repository |
||||||
|
- Merge pull requests |
||||||
|
- Manage issues |
||||||
|
- Update repository settings |
||||||
|
|
||||||
|
**To add a maintainer**: |
||||||
|
1. Go to Settings |
||||||
|
2. Enter the maintainer's npub |
||||||
|
3. Click "Add Maintainer" |
||||||
|
|
||||||
|
**To remove a maintainer**: |
||||||
|
1. Go to Settings |
||||||
|
2. Find the maintainer in the list |
||||||
|
3. Click "Remove" |
||||||
|
|
||||||
|
### Repository Description |
||||||
|
|
||||||
|
Update your repository description: |
||||||
|
1. Go to Settings |
||||||
|
2. Edit the description field |
||||||
|
3. Save changes |
||||||
|
|
||||||
|
### Clone URLs |
||||||
|
|
||||||
|
Add multiple clone URLs to sync your repository to other git hosts: |
||||||
|
1. Go to Settings |
||||||
|
2. Add clone URLs (one per line) |
||||||
|
3. Save changes |
||||||
|
|
||||||
|
When you push, GitRepublic will automatically sync to all configured remotes. |
||||||
|
|
||||||
|
### Ownership Transfer |
||||||
|
|
||||||
|
Transfer repository ownership to another user: |
||||||
|
1. Go to Settings |
||||||
|
2. Enter the new owner's npub |
||||||
|
3. Confirm the transfer |
||||||
|
|
||||||
|
**Important**: Ownership transfers are permanent and create a chain of ownership events. The new owner will have full control. |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Collaboration Features |
||||||
|
|
||||||
|
### Code Highlights |
||||||
|
|
||||||
|
Highlight specific code sections in pull requests: |
||||||
|
|
||||||
|
1. **Select code** in the PR diff view |
||||||
|
2. **Click "Highlight"** |
||||||
|
3. **Add a comment** explaining the highlight |
||||||
|
4. **Others can comment** on your highlights |
||||||
|
|
||||||
|
### Comments |
||||||
|
|
||||||
|
Comment on: |
||||||
|
- Pull requests |
||||||
|
- Issues |
||||||
|
- Code highlights |
||||||
|
- Specific lines in diffs |
||||||
|
|
||||||
|
Comments are threaded and use Nostr events (kind 1111) for persistence. |
||||||
|
|
||||||
|
### Notifications |
||||||
|
|
||||||
|
GitRepublic uses Nostr events for notifications. You can: |
||||||
|
- Subscribe to repository events |
||||||
|
- Get notified of new PRs, issues, and comments |
||||||
|
- Track changes using your Nostr client |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Best Practices |
||||||
|
|
||||||
|
### Repository Organization |
||||||
|
|
||||||
|
1. **Use descriptive names**: Choose clear, descriptive repository names |
||||||
|
2. **Write good READMEs**: Include installation instructions, usage examples, and contribution guidelines |
||||||
|
3. **Use tags for releases**: Tag important versions (e.g., `v1.0.0`) |
||||||
|
4. **Keep repositories focused**: One repository per project or component |
||||||
|
|
||||||
|
### Commit Messages |
||||||
|
|
||||||
|
Write clear, descriptive commit messages: |
||||||
|
|
||||||
|
```bash |
||||||
|
# Good |
||||||
|
git commit -m "Add user authentication feature" |
||||||
|
|
||||||
|
# Better |
||||||
|
git commit -m "Add user authentication with NIP-07 support |
||||||
|
|
||||||
|
- Implement NIP-07 browser extension authentication |
||||||
|
- Add login/logout functionality |
||||||
|
- Update UI to show user badge when logged in" |
||||||
|
``` |
||||||
|
|
||||||
|
### Branch Strategy |
||||||
|
|
||||||
|
- **main/master**: Production-ready code |
||||||
|
- **feature/**: New features |
||||||
|
- **bugfix/**: Bug fixes |
||||||
|
- **hotfix/**: Urgent production fixes |
||||||
|
|
||||||
|
### Pull Request Guidelines |
||||||
|
|
||||||
|
1. **Keep PRs focused**: One feature or fix per PR |
||||||
|
2. **Write clear descriptions**: Explain what and why, not just what |
||||||
|
3. **Link related issues**: Reference issues in PR descriptions |
||||||
|
4. **Request reviews**: Ask maintainers to review your PRs |
||||||
|
5. **Respond to feedback**: Address review comments promptly |
||||||
|
|
||||||
|
### Security |
||||||
|
|
||||||
|
1. **Keep your keys secure**: Never share your nsec (private key) |
||||||
|
2. **Use NIP-07 extensions**: Don't enter keys directly in web forms |
||||||
|
3. **Review maintainers**: Only add trusted users as maintainers |
||||||
|
4. **Monitor your repositories**: Check for unexpected changes |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Troubleshooting |
||||||
|
|
||||||
|
### Authentication Issues |
||||||
|
|
||||||
|
**Problem**: Can't push to repository |
||||||
|
|
||||||
|
**Solutions**: |
||||||
|
- Verify you're logged in with NIP-07 |
||||||
|
- Check that you're the owner or a maintainer |
||||||
|
- Ensure your NIP-98 authentication is configured correctly |
||||||
|
- Check repository privacy settings |
||||||
|
|
||||||
|
### Clone Fails |
||||||
|
|
||||||
|
**Problem**: Can't clone a repository |
||||||
|
|
||||||
|
**Solutions**: |
||||||
|
- Verify the repository URL is correct |
||||||
|
- Check if the repository is private (requires authentication) |
||||||
|
- Ensure you have network access to the GitRepublic instance |
||||||
|
- Try cloning with verbose output: `git clone -v {url}` |
||||||
|
|
||||||
|
### Push Fails |
||||||
|
|
||||||
|
**Problem**: Push is rejected |
||||||
|
|
||||||
|
**Solutions**: |
||||||
|
- Check repository size limit (2 GB maximum) |
||||||
|
- Verify you have write permissions |
||||||
|
- Ensure your branch is up to date: `git pull origin main` |
||||||
|
- Check for branch protection rules |
||||||
|
|
||||||
|
### Repository Not Found |
||||||
|
|
||||||
|
**Problem**: Repository doesn't appear after creation |
||||||
|
|
||||||
|
**Solutions**: |
||||||
|
- Wait a few moments for auto-provisioning |
||||||
|
- Refresh the page |
||||||
|
- Check that the NIP-34 announcement was published |
||||||
|
- Verify you're looking at the correct domain |
||||||
|
|
||||||
|
### Sync Issues |
||||||
|
|
||||||
|
**Problem**: Changes not syncing to other remotes |
||||||
|
|
||||||
|
**Solutions**: |
||||||
|
- Verify clone URLs are correct in repository settings |
||||||
|
- Check network connectivity to remote git hosts |
||||||
|
- Review server logs for sync errors |
||||||
|
- Manually push to remotes if needed |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Advanced Topics |
||||||
|
|
||||||
|
### NIP-34 Specification |
||||||
|
|
||||||
|
GitRepublic implements NIP-34 for repository announcements. Key event types: |
||||||
|
|
||||||
|
- **Kind 30617**: Repository announcement |
||||||
|
- **Kind 30618**: Repository state |
||||||
|
- **Kind 1617**: Git patch |
||||||
|
- **Kind 1618**: Pull request |
||||||
|
- **Kind 1621**: Issue |
||||||
|
- **Kind 1641**: Ownership transfer |
||||||
|
|
||||||
|
See the [NIP-34 specification](https://github.com/nostr-protocol/nips/blob/master/34.md) for full details. |
||||||
|
|
||||||
|
### NIP-98 HTTP Authentication |
||||||
|
|
||||||
|
Git operations use NIP-98 for authentication: |
||||||
|
|
||||||
|
1. Client creates an ephemeral event (kind 27235) |
||||||
|
2. Event includes request URL, method, and payload hash |
||||||
|
3. Client signs event and includes in `Authorization` header |
||||||
|
4. Server verifies signature and permissions |
||||||
|
|
||||||
|
### Relay Configuration |
||||||
|
|
||||||
|
GitRepublic uses Nostr relays to: |
||||||
|
- Publish repository announcements |
||||||
|
- Fetch repository metadata |
||||||
|
- Sync pull requests and issues |
||||||
|
- Track ownership transfers |
||||||
|
|
||||||
|
Default relays are configured, but you can use custom relays if needed. |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Getting Help |
||||||
|
|
||||||
|
- **Documentation**: Check this tutorial and the NIP-34 specification |
||||||
|
- **Issues**: Report bugs or request features via GitHub issues (if the instance has a GitHub repo) |
||||||
|
- **Community**: Join Nostr communities to discuss GitRepublic |
||||||
|
- **Support**: Contact the GitRepublic instance administrator |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
## Conclusion |
||||||
|
|
||||||
|
Congratulations! You now know how to use GitRepublic for decentralized git hosting. Remember: |
||||||
|
|
||||||
|
- GitRepublic is built on Nostr, making it truly decentralized |
||||||
|
- You have full control over your repositories |
||||||
|
- Collaboration happens through Nostr events |
||||||
|
- Security is handled via NIP-07 and NIP-98 |
||||||
|
|
||||||
|
Happy coding! 🚀 |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
/** |
||||||
|
* Server-side loader for GitRepublic documentation |
||||||
|
*/ |
||||||
|
|
||||||
|
import { readFile } from 'fs/promises'; |
||||||
|
import { join } from 'path'; |
||||||
|
import type { PageServerLoad } from './$types'; |
||||||
|
import logger from '$lib/services/logger.js'; |
||||||
|
|
||||||
|
export const load: PageServerLoad = async () => { |
||||||
|
try { |
||||||
|
// Read tutorial documentation from docs/tutorial.md
|
||||||
|
const filePath = join(process.cwd(), 'docs', 'tutorial.md'); |
||||||
|
const content = await readFile(filePath, 'utf-8'); |
||||||
|
return { content }; |
||||||
|
} catch (error) { |
||||||
|
logger.error({ error }, 'Error loading documentation'); |
||||||
|
return { content: null, error: 'Failed to load documentation' }; |
||||||
|
} |
||||||
|
}; |
||||||
@ -0,0 +1,170 @@ |
|||||||
|
<script lang="ts"> |
||||||
|
import { page } from '$app/stores'; |
||||||
|
import { onMount } from 'svelte'; |
||||||
|
|
||||||
|
let content = $state(''); |
||||||
|
let loading = $state(true); |
||||||
|
let error = $state<string | null>(null); |
||||||
|
|
||||||
|
onMount(async () => { |
||||||
|
try { |
||||||
|
const docContent = $page.data.content; |
||||||
|
if (docContent) { |
||||||
|
const MarkdownIt = (await import('markdown-it')).default; |
||||||
|
const hljsModule = await import('highlight.js'); |
||||||
|
const hljs = hljsModule.default || hljsModule; |
||||||
|
|
||||||
|
const md: any = new MarkdownIt({ |
||||||
|
highlight: function (str: string, lang: string): string { |
||||||
|
if (lang && hljs.getLanguage(lang)) { |
||||||
|
try { |
||||||
|
return '<pre class="hljs"><code>' + |
||||||
|
hljs.highlight(str, { language: lang }).value + |
||||||
|
'</code></pre>'; |
||||||
|
} catch (__) {} |
||||||
|
} |
||||||
|
return '<pre class="hljs"><code>' + md.utils.escapeHtml(str) + '</code></pre>'; |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
content = md.render(docContent); |
||||||
|
} else { |
||||||
|
error = $page.data.error || 'Failed to load documentation'; |
||||||
|
} |
||||||
|
} catch (err) { |
||||||
|
error = err instanceof Error ? err.message : 'Failed to load documentation'; |
||||||
|
console.error('Error parsing documentation:', err); |
||||||
|
} finally { |
||||||
|
loading = false; |
||||||
|
} |
||||||
|
}); |
||||||
|
</script> |
||||||
|
|
||||||
|
<div class="container-wide"> |
||||||
|
<header> |
||||||
|
<a href="/" class="back-link">← Back to Repositories</a> |
||||||
|
<h1>GitRepublic Documentation</h1> |
||||||
|
<p class="subtitle">Complete tutorial and walkthrough for decentralized git hosting</p> |
||||||
|
</header> |
||||||
|
|
||||||
|
<main class="docs-content"> |
||||||
|
{#if loading} |
||||||
|
<div class="loading">Loading documentation...</div> |
||||||
|
{:else if error} |
||||||
|
<div class="error">{error}</div> |
||||||
|
{:else} |
||||||
|
<div class="markdown-content"> |
||||||
|
{@html content} |
||||||
|
</div> |
||||||
|
{/if} |
||||||
|
</main> |
||||||
|
</div> |
||||||
|
|
||||||
|
<style> |
||||||
|
.subtitle { |
||||||
|
color: var(--text-muted); |
||||||
|
margin: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.docs-content { |
||||||
|
background: var(--card-bg); |
||||||
|
padding: 2rem; |
||||||
|
border-radius: 0.5rem; |
||||||
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content) { |
||||||
|
line-height: 1.6; |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content h1) { |
||||||
|
font-size: 2rem; |
||||||
|
margin-top: 2rem; |
||||||
|
margin-bottom: 1rem; |
||||||
|
border-bottom: 2px solid var(--border-color); |
||||||
|
padding-bottom: 0.5rem; |
||||||
|
color: var(--text-primary); |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content h2) { |
||||||
|
font-size: 1.5rem; |
||||||
|
margin-top: 1.5rem; |
||||||
|
margin-bottom: 0.75rem; |
||||||
|
color: var(--text-primary); |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content h3) { |
||||||
|
font-size: 1.25rem; |
||||||
|
margin-top: 1.25rem; |
||||||
|
margin-bottom: 0.5rem; |
||||||
|
color: var(--text-primary); |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content code) { |
||||||
|
background: var(--bg-secondary); |
||||||
|
padding: 0.125rem 0.25rem; |
||||||
|
border-radius: 0.25rem; |
||||||
|
font-family: 'IBM Plex Mono', monospace; |
||||||
|
font-size: 0.875em; |
||||||
|
color: var(--text-primary); |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content pre) { |
||||||
|
background: var(--bg-tertiary); |
||||||
|
color: var(--text-primary); |
||||||
|
padding: 1rem; |
||||||
|
border-radius: 0.5rem; |
||||||
|
overflow-x: auto; |
||||||
|
margin: 1rem 0; |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content pre code) { |
||||||
|
background: transparent; |
||||||
|
padding: 0; |
||||||
|
color: inherit; |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content p) { |
||||||
|
margin: 1rem 0; |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content ul, .markdown-content ol) { |
||||||
|
margin: 1rem 0; |
||||||
|
padding-left: 2rem; |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content li) { |
||||||
|
margin: 0.5rem 0; |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content blockquote) { |
||||||
|
border-left: 4px solid var(--accent); |
||||||
|
padding-left: 1rem; |
||||||
|
margin: 1rem 0; |
||||||
|
color: var(--text-secondary); |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content table) { |
||||||
|
width: 100%; |
||||||
|
border-collapse: collapse; |
||||||
|
margin: 1rem 0; |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content th, .markdown-content td) { |
||||||
|
border: 1px solid var(--border-color); |
||||||
|
padding: 0.5rem; |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content th) { |
||||||
|
background: var(--bg-secondary); |
||||||
|
font-weight: 600; |
||||||
|
color: var(--text-primary); |
||||||
|
} |
||||||
|
|
||||||
|
:global(.markdown-content td) { |
||||||
|
color: var(--text-primary); |
||||||
|
} |
||||||
|
</style> |
||||||
Loading…
Reference in new issue