removed server
All checks were successful
Build & publish Docker images / Build & push all images (push) Successful in 5s
All checks were successful
Build & publish Docker images / Build & push all images (push) Successful in 5s
This commit is contained in:
7
.claude/settings.local.json
Normal file
7
.claude/settings.local.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(git push *)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,21 +30,12 @@ jobs:
|
|||||||
echo "${{ secrets.REGISTRY_TOKEN }}" | \
|
echo "${{ secrets.REGISTRY_TOKEN }}" | \
|
||||||
docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin
|
docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin
|
||||||
|
|
||||||
- name: Build & push server
|
|
||||||
run: |
|
|
||||||
docker build \
|
|
||||||
-t ${{ env.REGISTRY }}/rocobo/gcp-dot-server:latest \
|
|
||||||
-t ${{ env.REGISTRY }}/rocobo/gcp-dot-server:${{ github.sha }} \
|
|
||||||
./server
|
|
||||||
docker push ${{ env.REGISTRY }}/rocobo/gcp-dot-server:latest
|
|
||||||
docker push ${{ env.REGISTRY }}/rocobo/gcp-dot-server:${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Build & push egg
|
- name: Build & push egg
|
||||||
run: |
|
run: |
|
||||||
docker build \
|
docker build \
|
||||||
-t ${{ env.REGISTRY }}/rocobo/gcp-dot-egg:latest \
|
-t ${{ env.REGISTRY }}/rocobo/gcp-dot-egg:latest \
|
||||||
-t ${{ env.REGISTRY }}/rocobo/gcp-dot-egg:${{ github.sha }} \
|
-t ${{ env.REGISTRY }}/rocobo/gcp-dot-egg:${{ github.sha }} \
|
||||||
./egg
|
.
|
||||||
docker push ${{ env.REGISTRY }}/rocobo/gcp-dot-egg:latest
|
docker push ${{ env.REGISTRY }}/rocobo/gcp-dot-egg:latest
|
||||||
docker push ${{ env.REGISTRY }}/rocobo/gcp-dot-egg:${{ github.sha }}
|
docker push ${{ env.REGISTRY }}/rocobo/gcp-dot-egg:${{ github.sha }}
|
||||||
|
|
||||||
|
|||||||
109
README.md
109
README.md
@@ -1,7 +1,8 @@
|
|||||||
# Global Consciousness Project — Self-Hosted
|
# GCP Egg
|
||||||
|
|
||||||
A live network-variance tracker inspired by the [Global Consciousness Project](https://global-mind.org).
|
Distributed client for the **Global Consciousness Project** — a self-hosted network variance tracker inspired by the [Global Consciousness Project](https://global-mind.org).
|
||||||
Distributed "egg" containers contribute random numbers; the server runs statistical analysis and displays a colored dot.
|
|
||||||
|
Each "egg" container draws 200 random bits per second from the OS hardware-entropy pool and submits the count of 1-bits to a central server, which runs Stouffer Z-score analysis and displays a live colored dot.
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
@@ -10,26 +11,16 @@ Egg containers (anyone can run)
|
|||||||
│ POST /api/data (one 200-bit trial per second)
|
│ POST /api/data (one 200-bit trial per second)
|
||||||
▼
|
▼
|
||||||
Server (FastAPI + SQLite)
|
Server (FastAPI + SQLite)
|
||||||
│ runs Stouffer Z network variance analysis every 60 s
|
│ Stouffer Z network variance analysis every 60 s
|
||||||
▼
|
▼
|
||||||
Website → animated dot + history chart + embeddable iframe
|
Website → animated dot + history chart + embeddable iframe
|
||||||
```
|
```
|
||||||
|
|
||||||
## Quick start — run the server
|
The server is maintained separately. This repo contains only the egg client.
|
||||||
|
|
||||||
```bash
|
## Run an Egg
|
||||||
git clone <this-repo>
|
|
||||||
cd gcp
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
The site is now at **http://localhost:8000**.
|
One Docker command is all it takes:
|
||||||
|
|
||||||
To expose it publicly, put it behind a reverse proxy (nginx, Caddy) or deploy to any VPS / cloud service.
|
|
||||||
|
|
||||||
## Contribute an egg
|
|
||||||
|
|
||||||
Anyone can run an egg — one Docker command:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d --restart unless-stopped \
|
docker run -d --restart unless-stopped \
|
||||||
@@ -38,40 +29,61 @@ docker run -d --restart unless-stopped \
|
|||||||
git.hexadual.io/rocobo/gcp-dot-egg:latest
|
git.hexadual.io/rocobo/gcp-dot-egg:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
The egg:
|
The egg will immediately start sending one trial per second and persist its ID across restarts.
|
||||||
- Reads 200-bit trials from the OS hardware-entropy pool (`os.urandom`) once per second
|
|
||||||
- Sends the trial count (0–200) to the server
|
|
||||||
- Persists its ID across restarts via `/data/egg_id`
|
|
||||||
|
|
||||||
## Images (built automatically by Gitea Actions)
|
## Environment Variables
|
||||||
|
|
||||||
Every push to `main` builds and publishes both images to the Gitea container registry:
|
| Variable | Default | Description |
|
||||||
|
|---|---|---|
|
||||||
|
| `SERVER_URL` | `http://localhost:8000` | Server to send trials to |
|
||||||
|
| `EGG_ID` | auto-generated | Override the egg's unique identifier |
|
||||||
|
|
||||||
| Image | Pull command |
|
The auto-generated ID is derived from a SHA-256 hash stored at `/data/egg_id` — mount a volume there to keep it stable across restarts.
|
||||||
|-------|-------------|
|
|
||||||
| Server | `docker pull git.hexadual.io/rocobo/gcp-dot-server:latest` |
|
## Build from Source
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build -t gcp-egg .
|
||||||
|
docker run -d --restart unless-stopped \
|
||||||
|
-e SERVER_URL=https://your-domain.com \
|
||||||
|
-v gcp_egg_data:/data \
|
||||||
|
gcp-egg
|
||||||
|
```
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
GCP/
|
||||||
|
├── egg.py # Egg client — all logic (~70 lines)
|
||||||
|
├── requirements.txt # requests==2.31.0
|
||||||
|
├── Dockerfile
|
||||||
|
└── .gitea/workflows/
|
||||||
|
└── docker.yml # CI: builds and pushes egg image on every push to main
|
||||||
|
```
|
||||||
|
|
||||||
|
## Published Images
|
||||||
|
|
||||||
|
Every push to `main` builds and publishes to the Gitea container registry via Gitea Actions:
|
||||||
|
|
||||||
|
| Image | Pull |
|
||||||
|
|---|---|
|
||||||
| Egg | `docker pull git.hexadual.io/rocobo/gcp-dot-egg:latest` |
|
| Egg | `docker pull git.hexadual.io/rocobo/gcp-dot-egg:latest` |
|
||||||
|
| Server | `docker pull git.hexadual.io/rocobo/gcp-dot-server:latest` |
|
||||||
|
|
||||||
## How the analysis works
|
## How the Analysis Works
|
||||||
|
|
||||||
Every 60 seconds the server analyses the past hour of data:
|
The server analyses the past hour of data every 60 seconds:
|
||||||
|
|
||||||
1. **Normalise** each trial to a Z-score: `z = (trial − 100) / √50`
|
1. **Normalise** each trial to a Z-score: `z = (trial − 100) / √50`
|
||||||
(expected mean = 100, variance = 50 for Binomial(200, 0.5))
|
(Binomial(200, 0.5) has mean = 100, variance = 50)
|
||||||
|
2. **Stouffer Z** per second across all active eggs: `S_t = Σzᵢ / √N`
|
||||||
2. **Stouffer Z** per second across all active eggs: `S_t = Σzᵢₜ / √N`
|
|
||||||
|
|
||||||
3. **Network variance**: `V = Σ S_t²` — follows χ²(T) under H₀
|
3. **Network variance**: `V = Σ S_t²` — follows χ²(T) under H₀
|
||||||
|
4. **Index** = lower-tail CDF × 100
|
||||||
|
|
||||||
4. **Index** = lower-tail CDF × 100:
|
### Color Table
|
||||||
- **High index (> 95)** → small variance → eggs are more coherent than chance → **blue**
|
|
||||||
- **Low index (< 5)** → large variance → eggs are noisier than chance → **red**
|
|
||||||
- **Middle (40–90)** → normal random behavior → **green**
|
|
||||||
|
|
||||||
### Color table
|
|
||||||
|
|
||||||
| Color | Index | Meaning |
|
| Color | Index | Meaning |
|
||||||
|--------|-----------|---------|
|
|---|---|---|
|
||||||
| Blue | > 95% | Significantly small variance — deep coherence |
|
| Blue | > 95% | Significantly small variance — deep coherence |
|
||||||
| Cyan | 90–95% | Small variance — probable coherence |
|
| Cyan | 90–95% | Small variance — probable coherence |
|
||||||
| Green | 40–90% | Normal random behavior |
|
| Green | 40–90% | Normal random behavior |
|
||||||
@@ -79,31 +91,18 @@ Every 60 seconds the server analyses the past hour of data:
|
|||||||
| Orange | 5–10% | Strongly elevated variance |
|
| Orange | 5–10% | Strongly elevated variance |
|
||||||
| Red | < 5% | Significantly large variance |
|
| Red | < 5% | Significantly large variance |
|
||||||
|
|
||||||
## Embed the dot
|
## Embed the Dot
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<iframe src="https://your-domain.com/gcp.html"
|
<iframe src="https://your-domain.com/gcp.html"
|
||||||
height="48" width="48" scrolling="no" frameborder="0"></iframe>
|
height="48" width="48" scrolling="no" frameborder="0"></iframe>
|
||||||
```
|
```
|
||||||
|
|
||||||
## API
|
## Server API Reference
|
||||||
|
|
||||||
| Endpoint | Description |
|
| Endpoint | Description |
|
||||||
|----------|-------------|
|
|---|---|
|
||||||
| `POST /api/data` | Submit a trial `{egg_id, timestamp, trial}` |
|
| `POST /api/data` | Submit a trial `{egg_id, timestamp, trial}` |
|
||||||
| `GET /api/status` | Latest analysis result |
|
| `GET /api/status` | Latest analysis result |
|
||||||
| `GET /api/history?limit=60` | Last N analysis records |
|
| `GET /api/history?limit=60` | Last N analysis records |
|
||||||
| `GET /api/eggs` | Eggs active in the last 2 minutes |
|
| `GET /api/eggs` | Eggs active in the last 2 minutes |
|
||||||
|
|
||||||
## Environment variables
|
|
||||||
|
|
||||||
### Server
|
|
||||||
| Variable | Default | Description |
|
|
||||||
|----------|---------|-------------|
|
|
||||||
| `DB_PATH` | `/data/gcp.db` | SQLite database path |
|
|
||||||
|
|
||||||
### Egg
|
|
||||||
| Variable | Default | Description |
|
|
||||||
|----------|---------|-------------|
|
|
||||||
| `SERVER_URL` | `http://localhost:8000` | Server to send data to |
|
|
||||||
| `EGG_ID` | auto-generated | Override the egg's identifier |
|
|
||||||
|
|||||||
Reference in New Issue
Block a user