refactor: split content from AI tooling, prepare for rename to p2pwiki-ai
CI/CD / deploy (push) Successful in 1m6s Details

- Remove blog_static/ and blog_sample/ files (moved to p2pfoundation-wiki repo)
- Update CI/CD: rename p2pwiki-content → p2pwiki-ai (image, deploy path)
- Make content paths configurable via CONTENT_DIR env var in config.py
- Update parser.py to use settings.articles_dir instead of hardcoded path
- Update docker-compose.yml: HOST_XMLDUMP_DIR for flexible content mounting
- Rewrite README.md: link to content repo, document env vars
- Update .env.example with content path configuration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-04-14 14:24:05 -04:00
parent 8c75966f99
commit 89fcbf0595
12 changed files with 90 additions and 1356 deletions

View File

@ -1,5 +1,11 @@
# P2P Wiki AI Configuration # P2P Wiki AI Configuration
# Content paths (for split repo setup)
# Set HOST_XMLDUMP_DIR to point to the content repo's xmldump directory
# HOST_XMLDUMP_DIR=/opt/content/p2pfoundation-wiki/xmldump
# CONTENT_DIR can also be set inside the container to resolve articles_dir and xmldump_dir
# CONTENT_DIR=/app/content
# Ollama (Local LLM) # Ollama (Local LLM)
OLLAMA_BASE_URL=http://localhost:11434 OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.2 OLLAMA_MODEL=llama3.2
@ -15,3 +21,7 @@ USE_OLLAMA_FOR_CHAT=true
# Server # Server
HOST=0.0.0.0 HOST=0.0.0.0
PORT=8420 PORT=8420
# Infisical (for production — fetches ANTHROPIC_API_KEY at startup)
# INFISICAL_CLIENT_ID=
# INFISICAL_CLIENT_SECRET=

View File

@ -1,6 +1,6 @@
# Gitea Actions CI/CD — Static Site (no tests, build + deploy only) # Gitea Actions CI/CD — Static Site (no tests, build + deploy only)
# Copy to: <repo>/.gitea/workflows/ci.yml # Copy to: <repo>/.gitea/workflows/ci.yml
# Replace: p2pwiki-content, /opt/apps/p2pwiki-content, https://p2pwiki.jeffemmett.com/ # Replace: p2pwiki-ai, /opt/apps/p2pwiki-ai, https://p2pwiki.jeffemmett.com/
name: CI/CD name: CI/CD
@ -10,7 +10,7 @@ on:
env: env:
REGISTRY: localhost:3000 REGISTRY: localhost:3000
IMAGE: localhost:3000/jeffemmett/p2pwiki-content IMAGE: localhost:3000/jeffemmett/p2pwiki-ai
jobs: jobs:
deploy: deploy:
@ -42,7 +42,7 @@ jobs:
echo "${{ secrets.DEPLOY_SSH_KEY }}" | base64 -d > ~/.ssh/deploy_key echo "${{ secrets.DEPLOY_SSH_KEY }}" | base64 -d > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key chmod 600 ~/.ssh/deploy_key
ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key root@${{ secrets.DEPLOY_HOST }} " ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key root@${{ secrets.DEPLOY_HOST }} "
cd /opt/apps/p2pwiki-content cd /opt/apps/p2pwiki-ai
cat .last-deployed-tag 2>/dev/null > .rollback-tag || true cat .last-deployed-tag 2>/dev/null > .rollback-tag || true
echo '${{ env.IMAGE_TAG }}' > .last-deployed-tag echo '${{ env.IMAGE_TAG }}' > .last-deployed-tag
docker pull ${{ env.IMAGE }}:${{ env.IMAGE_TAG }} docker pull ${{ env.IMAGE }}:${{ env.IMAGE_TAG }}
@ -58,10 +58,10 @@ jobs:
echo "Smoke test passed (p2pwiki-ai: $STATUS)" echo "Smoke test passed (p2pwiki-ai: $STATUS)"
else else
echo "Smoke test failed (p2pwiki-ai not running) — rolling back" echo "Smoke test failed (p2pwiki-ai not running) — rolling back"
ROLLBACK_TAG=$(ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key root@${{ secrets.DEPLOY_HOST }} "cat /opt/apps/p2pwiki-content/.rollback-tag 2>/dev/null") ROLLBACK_TAG=$(ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key root@${{ secrets.DEPLOY_HOST }} "cat /opt/apps/p2pwiki-ai/.rollback-tag 2>/dev/null")
if [ -n "$ROLLBACK_TAG" ]; then if [ -n "$ROLLBACK_TAG" ]; then
ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key root@${{ secrets.DEPLOY_HOST }} \ ssh -o StrictHostKeyChecking=no -i ~/.ssh/deploy_key root@${{ secrets.DEPLOY_HOST }} \
"cd /opt/apps/p2pwiki-content && IMAGE_TAG=$ROLLBACK_TAG docker compose up -d --no-build p2pwiki-ai" "cd /opt/apps/p2pwiki-ai && IMAGE_TAG=$ROLLBACK_TAG docker compose up -d --no-build p2pwiki-ai"
echo "Rolled back to $ROLLBACK_TAG" echo "Rolled back to $ROLLBACK_TAG"
fi fi
exit 1 exit 1

3
.gitignore vendored
View File

@ -17,8 +17,9 @@ xmldump-2014.tar.gz
articles/ articles/
articles.tar.gz articles.tar.gz
# Blog static export (too large for git) # Content moved to p2pfoundation-wiki repo
blog_static/ blog_static/
blog_sample/
# Environment # Environment
.env .env

213
README.md
View File

@ -2,198 +2,87 @@
AI-augmented system for the P2P Foundation Wiki with two main features: AI-augmented system for the P2P Foundation Wiki with two main features:
1. **Conversational Agent** - Ask questions about the 23,000+ wiki articles using RAG (Retrieval Augmented Generation) 1. **Conversational Agent** — Ask questions about 23,000+ wiki articles using RAG (Retrieval Augmented Generation)
2. **Article Ingress Pipeline** - Drop article URLs to automatically analyze content, find matching wiki articles for citations, and generate draft articles 2. **Article Ingress Pipeline** Drop article URLs to automatically analyze content, find matching wiki articles, and generate drafts
## Architecture Content (wiki articles, XML dumps, infrastructure configs) lives in a separate repo:
**[p2pfoundation-wiki](https://gitea.jeffemmett.com/jeffemmett/p2pfoundation-wiki)**
```
┌─────────────────────────────────────────────────────────────────┐
│ P2P Wiki AI System │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Chat (Q&A) │ │ Ingress Tool │ │
│ │ via RAG │ │ (URL Drop) │ │
│ └────────┬────────┘ └────────┬────────┘ │
│ │ │ │
│ └───────────┬───────────┘ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ FastAPI Backend │ │
│ └───────────┬───────────┘ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ ChromaDB │ │ Ollama/ │ │ Article │ │
│ │ (Vector) │ │ Claude │ │ Scraper │ │
│ └──────────┘ └─────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
## Quick Start ## Quick Start
### 1. Prerequisites ### Prerequisites
- Python 3.10+ - Python 3.10+
- [Ollama](https://ollama.ai) installed locally (or access to a remote Ollama server) - [Ollama](https://ollama.ai) installed locally (or access to a remote Ollama server)
- Optional: Anthropic API key for Claude (higher quality article drafts) - Optional: Anthropic API key for Claude (higher quality article drafts)
### 2. Install Dependencies ### Install & Run
```bash ```bash
cd /home/jeffe/Github/p2pwiki-content
pip install -e . pip install -e .
```
### 3. Parse Wiki Content # Parse wiki content (from XML dumps or articles directory)
Convert the MediaWiki XML dumps to searchable JSON:
```bash
python -m src.parser python -m src.parser
```
This creates `data/articles.json` with all parsed articles (~23,000 pages). # Generate embeddings
### 4. Generate Embeddings
Create the vector store for semantic search:
```bash
python -m src.embeddings python -m src.embeddings
```
This creates the ChromaDB vector store in `data/chroma/`. Takes a few minutes. # Start server
### 5. Configure Environment
```bash
cp .env.example .env
# Edit .env with your settings
```
### 6. Run the Server
```bash
python -m src.api python -m src.api
``` ```
Visit http://localhost:8420/ui for the web interface. Visit http://localhost:8420/ui for the web interface.
## Docker Deployment ### Content Directory
For production deployment on the RS 8000: By default, the system looks for `xmldump/` and `articles/articles/` in the project root. To point at the separate content repo:
```bash ```bash
# Build and run # In .env
docker compose up -d --build CONTENT_DIR=/path/to/p2pfoundation-wiki
# Check logs
docker compose logs -f
# Access at http://localhost:8420/ui
# Or via Traefik at https://wiki-ai.jeffemmett.com
``` ```
Or mount via Docker:
```bash
HOST_XMLDUMP_DIR=/opt/content/p2pfoundation-wiki/xmldump docker compose up -d
```
## Docker Deployment
```bash
docker compose up -d --build
docker compose logs -f
```
## Configuration
Copy `.env.example` to `.env` and configure:
| Variable | Default | Description |
|----------|---------|-------------|
| `CONTENT_DIR` | (unset) | Path to content repo (resolves xmldump + articles) |
| `HOST_XMLDUMP_DIR` | `./xmldump` | Host path for XML dump volume mount |
| `OLLAMA_BASE_URL` | `http://localhost:11434` | Ollama server URL |
| `OLLAMA_MODEL` | `llama3.2` | Model for chat Q&A |
| `CLAUDE_MODEL` | `claude-sonnet-4-20250514` | Model for article drafts |
| `USE_CLAUDE_FOR_DRAFTS` | `true` | Route drafts to Claude |
| `USE_OLLAMA_FOR_CHAT` | `true` | Route chat to Ollama |
| `ANTHROPIC_API_KEY` | (unset) | Claude API key (or via Infisical) |
## API Endpoints ## API Endpoints
### Chat | Endpoint | Method | Description |
|----------|--------|-------------|
```bash | `/chat` | POST | Ask questions about wiki content |
# Ask a question | `/ingress` | POST | Process external article URL |
curl -X POST http://localhost:8420/chat \ | `/review` | GET | List items in review queue |
-H "Content-Type: application/json" \ | `/review/action` | POST | Approve/reject draft |
-d '{"query": "What is commons-based peer production?"}' | `/search` | GET | Direct vector search |
``` | `/articles` | GET | List article titles |
| `/health` | GET | Health check |
### Ingress
```bash
# Process an external article
curl -X POST http://localhost:8420/ingress \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/article-about-cooperatives"}'
```
### Review Queue
```bash
# Get all items in review queue
curl http://localhost:8420/review
# Approve a draft article
curl -X POST http://localhost:8420/review/action \
-H "Content-Type: application/json" \
-d '{"filepath": "/path/to/item.json", "item_type": "draft", "item_index": 0, "action": "approve"}'
```
### Search
```bash
# Direct vector search
curl "http://localhost:8420/search?q=cooperative%20economics&n=10"
# List article titles
curl "http://localhost:8420/articles?limit=100"
```
## Hybrid AI Routing
The system uses intelligent routing between local (Ollama) and cloud (Claude) LLMs:
| Task | Default LLM | Reasoning |
|------|-------------|-----------|
| Chat Q&A | Ollama | Fast, free, good enough for retrieval-based answers |
| Content Analysis | Claude | Better at extracting topics and identifying wiki relevance |
| Draft Generation | Claude | Higher quality article writing |
| Embeddings | Local (sentence-transformers) | Fast, free, optimized for semantic search |
Configure in `.env`:
```
USE_CLAUDE_FOR_DRAFTS=true
USE_OLLAMA_FOR_CHAT=true
```
## Project Structure
```
p2pwiki-content/
├── src/
│ ├── api.py # FastAPI backend
│ ├── config.py # Configuration settings
│ ├── embeddings.py # Vector store (ChromaDB)
│ ├── ingress.py # Article scraper & analyzer
│ ├── llm.py # LLM client (Ollama/Claude)
│ ├── parser.py # MediaWiki XML parser
│ └── rag.py # RAG chat system
├── web/
│ └── index.html # Web UI
├── data/
│ ├── articles.json # Parsed wiki content
│ ├── chroma/ # Vector store
│ └── review_queue/ # Pending ingress items
├── xmldump/ # MediaWiki XML dumps
├── docker-compose.yml
├── Dockerfile
└── pyproject.toml
```
## Content Coverage
The P2P Foundation Wiki contains ~23,000 articles covering:
- Peer-to-peer networks and culture
- Commons-based peer production (CBPP)
- Alternative economics and post-capitalism
- Cooperative business models
- Open source and free culture
- Collaborative governance
- Sustainability and ecology
## License ## License
The wiki content is from the P2P Foundation under their respective licenses.
The AI system code is provided as-is for educational purposes. The AI system code is provided as-is for educational purposes.
Wiki content is from the P2P Foundation under [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/).

View File

@ -1,781 +0,0 @@
<!doctype html><html
lang=en-US class=is-header-fixed><head><meta
charset=UTF-8><meta
name=viewport content="width=device-width, initial-scale=1"><title>10 blockchain projects to keep an eye on | P2P Foundation</title><meta
name=description content="The blockchain space is fast-moving and constantly brimming with new projects that could make the sharing economy increasingly accessible to all."><meta
name=robots content="noindex, follow"><meta
property=og:locale content=en_US><meta
property=og:type content=article><meta
property=og:title content="10 blockchain projects to keep an eye on | P2P Foundation"><meta
property=og:description content="The blockchain space is fast-moving and constantly brimming with new projects that could make the sharing economy increasingly accessible to all."><meta
property=og:url content=https://www.shareable.net/10-blockchain-projects-to-keep-an-eye-on/ ><meta
property=og:site_name content="P2P Foundation"><meta
property=article:publisher content=https://www.facebook.com/P2PFoundation><meta
property=article:published_time content=2018-09-23T10:00:00+00:00><meta
property=article:modified_time content=2021-05-13T21:26:44+00:00><meta
property=og:image content=https://blog.p2pfoundation.net/wp-content/uploads/blockchain.jpg><meta
property=og:image:width content=750><meta
property=og:image:height content=450><meta
name=twitter:card content=summary_large_image><meta
name=twitter:creator content=@p2p_foundation><meta
name=twitter:site content=@p2p_foundation> <script type=application/ld+json class=yoast-schema-graph>{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://blog.p2pfoundation.net/#website","url":"https://blog.p2pfoundation.net/","name":"P2P Foundation","description":"Researching, documenting and promoting peer to peer practices","potentialAction":[{"@type":"SearchAction","target":"https://blog.p2pfoundation.net/?s={search_term_string}","query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"ImageObject","@id":"https://www.shareable.net/10-blockchain-projects-to-keep-an-eye-on/#primaryimage","inLanguage":"en-US","url":"https://blog.p2pfoundation.net/wp-content/uploads/blockchain.jpg","width":750,"height":450},{"@type":"WebPage","@id":"https://www.shareable.net/10-blockchain-projects-to-keep-an-eye-on/#webpage","url":"https://www.shareable.net/10-blockchain-projects-to-keep-an-eye-on/","name":"10 blockchain projects to keep an eye on | P2P Foundation","isPartOf":{"@id":"https://blog.p2pfoundation.net/#website"},"primaryImageOfPage":{"@id":"https://www.shareable.net/10-blockchain-projects-to-keep-an-eye-on/#primaryimage"},"datePublished":"2018-09-23T10:00:00+00:00","dateModified":"2021-05-13T21:26:44+00:00","author":{"@id":"https://blog.p2pfoundation.net/#/schema/person/c247fb5537a67a00e9384d69579b682d"},"description":"The blockchain space is fast-moving and constantly brimming with new projects that could make the sharing economy increasingly accessible to all.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://www.shareable.net/10-blockchain-projects-to-keep-an-eye-on/"]}]},{"@type":"Person","@id":"https://blog.p2pfoundation.net/#/schema/person/c247fb5537a67a00e9384d69579b682d","name":"Shareable","image":{"@type":"ImageObject","@id":"https://blog.p2pfoundation.net/#personlogo","inLanguage":"en-US","url":"https://secure.gravatar.com/avatar/d80dd2f9d1b33a5a2dc91071c8df87c2?s=96&d=blank&r=pg","caption":"Shareable"},"description":"Shareable is an award-winning nonprofit news, action and connection hub for the sharing transformation. What\u2019s the sharing transformation? It\u2019s a movement of movements emerging from the grassroots up to solve today\u2019s biggest challenges, which old, top-down institutions are failing to address. Behind these failing industrial-age institutions are outmoded beliefs about how the world works \u2013 that ordinary people can\u2019t govern themselves directly; that nonstop economic growth leads to widespread prosperity; and that more stuff leads to more happiness. Amid crisis, a new way forward is emerging \u2013 the sharing transformation. The sharing transformation is big, global, and impacts every part of society. Visit Shareable.net for more."}]}</script> <link
rel=dns-prefetch href=//hcaptcha.com><link
rel=dns-prefetch href=//secure.gravatar.com><link
rel=dns-prefetch href=//fonts.googleapis.com><link
rel=dns-prefetch href=//s.w.org><link
rel=dns-prefetch href=//v0.wordpress.com><link
rel=alternate type=application/rss+xml title="P2P Foundation &raquo; Feed" href=https://blog.p2pfoundation.net/feed/ ><link
rel=alternate type=application/rss+xml title="P2P Foundation &raquo; Comments Feed" href=https://blog.p2pfoundation.net/comments/feed/ ><link
rel=alternate type=application/rss+xml title="P2P Foundation &raquo; 10 blockchain projects to keep an eye on Comments Feed" href=https://blog.p2pfoundation.net/10-blockchain-projects-to-keep-an-eye-on/feed/ >
<script data-cfasync=false>var mi_version = '7.12.2';
var mi_track_user = true;
var mi_no_track_reason = '';
var disableStr = 'ga-disable-UA-184755-2';
/* Function to detect opted out users */
function __gaTrackerIsOptedOut() {
return document.cookie.indexOf(disableStr + '=true') > -1;
}
/* Disable tracking if the opt-out cookie exists. */
if ( __gaTrackerIsOptedOut() ) {
window[disableStr] = true;
}
/* Opt-out function */
function __gaTrackerOptout() {
document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
window[disableStr] = true;
}
if ( 'undefined' === typeof gaOptout ) {
function gaOptout() {
__gaTrackerOptout();
}
}
if ( mi_track_user ) {
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','__gaTracker');
__gaTracker('create', 'UA-184755-2', 'auto');
__gaTracker('set', 'forceSSL', true);
__gaTracker('send','pageview');
} else {
console.log( "" );
(function() {
/* https://developers.google.com/analytics/devguides/collection/analyticsjs/ */
var noopfn = function() {
return null;
};
var noopnullfn = function() {
return null;
};
var Tracker = function() {
return null;
};
var p = Tracker.prototype;
p.get = noopfn;
p.set = noopfn;
p.send = noopfn;
var __gaTracker = function() {
var len = arguments.length;
if ( len === 0 ) {
return;
}
var f = arguments[len-1];
if ( typeof f !== 'object' || f === null || typeof f.hitCallback !== 'function' ) {
console.log( 'Not running function __gaTracker(' + arguments[0] + " ....) because you are not being tracked. " + mi_no_track_reason );
return;
}
try {
f.hitCallback();
} catch (ex) {
}
};
__gaTracker.create = function() {
return new Tracker();
};
__gaTracker.getByName = noopnullfn;
__gaTracker.getAll = function() {
return [];
};
__gaTracker.remove = noopfn;
window['__gaTracker'] = __gaTracker;
})();
}</script> <script>window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/blog.p2pfoundation.net\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.5.17"}};
!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode;p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0);e=i.toDataURL();return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(!p||!p.fillText)return!1;switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([55357,56424,8205,55356,57212],[55357,56424,8203,55356,57212])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(n=t.source||{}).concatemoji?c(n.concatemoji):n.wpemoji&&n.twemoji&&(c(n.twemoji),c(n.wpemoji)))}(window,document,window._wpemojiSettings);</script> <style>img.wp-smiley,
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 .07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}</style><link
rel=stylesheet href=https://blog.p2pfoundation.net/wp-content/cache/minify/a5ff7.css media=all><style id=wp-block-library-inline-css>.has-text-align-justify{text-align:justify;}</style><link
rel=stylesheet href=https://blog.p2pfoundation.net/wp-content/cache/minify/8a106.css media=all><link
rel=stylesheet id=noticia-text-css href='//fonts.googleapis.com/css?family=Noticia+Text:400,400italic,700,700italic&#038;subset=latin' type=text/css media=all><link
rel=stylesheet href=https://blog.p2pfoundation.net/wp-content/cache/minify/a2679.css media=all> <script id=monsterinsights-frontend-script-js-extra>var monsterinsights_frontend = {"js_events_tracking":"true","download_extensions":"doc,pdf,ppt,zip,xls,docx,pptx,xlsx","inbound_paths":"[]","home_url":"https:\/\/blog.p2pfoundation.net","hash_tracking":"false"};</script> <script src=https://blog.p2pfoundation.net/wp-content/cache/minify/0ee0f.js></script> <link
rel=https://api.w.org/ href=https://blog.p2pfoundation.net/wp-json/ ><link
rel=alternate type=application/json href=https://blog.p2pfoundation.net/wp-json/wp/v2/posts/72709><link
rel=EditURI type=application/rsd+xml title=RSD href=https://blog.p2pfoundation.net/xmlrpc.php?rsd><link
rel=wlwmanifest type=application/wlwmanifest+xml href=https://blog.p2pfoundation.net/wp-includes/wlwmanifest.xml><meta
name=generator content="WordPress 5.5.17"><link
rel=shortlink href=https://wp.me/p4csWb-iUJ><link
rel=alternate type=application/json+oembed href="https://blog.p2pfoundation.net/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fblog.p2pfoundation.net%2F10-blockchain-projects-to-keep-an-eye-on%2F"><link
rel=alternate type=text/xml+oembed href="https://blog.p2pfoundation.net/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fblog.p2pfoundation.net%2F10-blockchain-projects-to-keep-an-eye-on%2F&#038;format=xml"><style>#category-posts-2-internal .cat-post-thumbnail .cat-post-crop img {object-fit: cover;max-width:100%;}
#category-posts-2-internal .cat-post-thumbnail .cat-post-crop-not-supported img {width:100%;}
#category-posts-2-internal .cat-post-thumbnail {max-width:100%;}
#category-posts-2-internal .cat-post-item img {margin: initial;}
#category-posts-2-internal .cat-post-thumbnail {float:left;}</style><link
rel=stylesheet href=https://blog.p2pfoundation.net/wp-content/cache/minify/5106b.css media=all> <script>var jspq_options = new Array("1", "1", "right", "1", "1", "div", "pullquote", "pullquote pqRight");</script> <script src=https://blog.p2pfoundation.net/wp-content/cache/minify/b362a.js></script> <!--[if lt IE 9]> <script src=https://blog.p2pfoundation.net/wp-content/themes/readme/js/ie.js></script> <![endif]--><style>.author-info a:not(.button),
.category-description a:not(.button),
.entry-content a:not(.button) {
margin: 0 4px;
color: #333;
font-weight: bold;
border-bottom: 2px solid #ddd;
}
.author-info a:hover:not(.button),
.category-description a:hover:not(.button),
.entry-content a:hover:not(.button) {
border-bottom: 2px solid #333;
}
.author-info a:active:not(.button),
.category-description a:active:not(.button),
.entry-content a:active:not(.button) {
color: #aaa;
}
@media screen and (min-width: 521px) and (max-width: 768px) {
h4.author-name {
clear: both;
}
.with-sidebar {
width: 75%;
}
.sidebar {
width: 25%;
}
}
@media screen and (max-width: 991px) {
.share.sharer-0 {
display: block !important;
position: absolute;
top: 10px;
}
}</style><style>.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style></head><body
class="post-template-default single single-post postid-72709 single-format-standard cookies-not-set"><div
id=page class="hfeed site"><header
id=masthead class=site-header role=banner><h1 class="site-title">
<a
href=https://blog.p2pfoundation.net/ rel=home>
<img
alt="P2P Foundation" src=//blog.p2pfoundation.net/wp-content/uploads/p2pf-logo-title.png>
</a></h1><nav
id=primary-navigation class="site-navigation primary-navigation" role=navigation>
<a
class="menu-toggle toggle-link"></a><div
class=nav-menu><ul
id=nav class="menu-custom vs-nav"><li
id=menu-item-67465 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-67465"><a
href=https://p2pfoundation.net/ >ABOUT</a></li><li
id=menu-item-60905 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-60905"><a
href=#>CONTENT</a><ul
class=sub-menu><li
id=menu-item-57090 class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-57090"><a
href=https://blog.p2pfoundation.net/category/p2pfoundation/p2pf_original_content/ >P2PF Articles</a></li><li
id=menu-item-57092 class="menu-item menu-item-type-taxonomy menu-item-object-post_format menu-item-57092"><a
title="Featured Videos" href=https://blog.p2pfoundation.net/type/video/ >Video</a></li><li
id=menu-item-60078 class="menu-item menu-item-type-taxonomy menu-item-object-post_format menu-item-60078"><a
title="Featured Audio" href=https://blog.p2pfoundation.net/type/audio/ >Audio</a></li><li
id=menu-item-53968 class="menu-item menu-item-type-post_type menu-item-object-page menu-item-53968"><a
href=https://blog.p2pfoundation.net/archives/ >Archives</a></li><li
id=menu-item-53925 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-53925"><a
href=http://p2pfoundation.net/the-p2p-foundation/about-the-p2p-foundation#section2>STREAMS</a><ul
class=sub-menu><li
id=menu-item-53949 class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-53949"><a
href=https://blog.p2pfoundation.net/category/channels-streams/open-coops-sustainable-livelihoods/ >Open Coops &#038; Sustainable Livelihoods</a></li><li
id=menu-item-53951 class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-53951"><a
href=https://blog.p2pfoundation.net/category/channels-streams/p2p-cultures-and-politics/ >P2P Cultures and Politics</a></li><li
id=menu-item-53948 class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-53948"><a
href=https://blog.p2pfoundation.net/category/channels-streams/building-the-osce/ >Building the Open Source Circular Economy</a></li></ul></li></ul></li><li
id=menu-item-53926 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-53926"><a
href=https://p2pfoundation.net/knowledge-commons>OUR WEBSITES</a><ul
class=sub-menu><li
id=menu-item-69072 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-69072"><a
href=https://p2pfoundation.net/ >P2P Foundation Homepage</a></li><li
id=menu-item-53935 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-53935"><a
href=https://wiki.p2pfoundation.net/Main_Page>P2P Foundation Wiki</a></li><li
id=menu-item-69071 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-69071"><a>Commons Transition</a><ul
class=sub-menu><li
id=menu-item-69070 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-69070"><a
href=https://primer.commonstransition.org/ >The Commons Transition Primer</a></li><li
id=menu-item-53936 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-53936"><a
href=http://commonstransition.org/ >Commons Transition</a></li><li
id=menu-item-53937 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-53937"><a
href=http://commonstransition.org/stories/ >Commons Transition Stories</a></li><li
id=menu-item-53938 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-53938"><a
href=http://wiki.commonstransition.org/wiki/Main_Page>Commons Transition Wiki</a></li></ul></li><li
id=menu-item-53939 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-53939"><a
href=http://www.p2plab.gr/en/ >P2P Lab</a></li><li
id=menu-item-54198 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-54198"><a>PROJECTS</a><ul
class=sub-menu><li
id=menu-item-69450 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-69450"><a
href=http://www.p2plab.gr/en/archives/1119>Phygital</a></li><li
id=menu-item-69449 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-69449"><a
href=http://odmplatform.eu/ >Open Design &#038; Manufacturing</a></li><li
id=menu-item-54199 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-54199"><a
href=http://p2pvalue.eu/ >P2Pvalue</a></li></ul></li></ul></li><li
id=menu-item-53927 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-53927"><a
href=#>PARTICIPATE</a><ul
class=sub-menu><li
id=menu-item-53928 class="menu-item menu-item-type-post_type menu-item-object-page menu-item-53928"><a
href=https://blog.p2pfoundation.net/join-the-blog-team/ >Blog</a></li><li
id=menu-item-68858 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-68858"><a
href=https://p2pfoundation.net/infrastructure/donate>Donate</a></li><li
id=menu-item-53930 class="menu-item menu-item-type-post_type menu-item-object-page menu-item-53930"><a
href=https://blog.p2pfoundation.net/mailing-list/ >Mailing List</a></li><li
id=menu-item-53931 class="menu-item menu-item-type-post_type menu-item-object-page menu-item-53931"><a
href=https://blog.p2pfoundation.net/contact/ >Contact</a></li></ul></li><li
id=menu-item-53932 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-53932"><a
href=#>ENG</a><ul
class=sub-menu><li
id=menu-item-53933 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-53933"><a
href=http://blognl.p2pfoundation.net/ >DUTCH</a></li><li
id=menu-item-54782 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-54782"><a
href=http://blogfr.p2pfoundation.net/ >FRENCH</a></li><li
id=menu-item-53934 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-53934"><a
href=http://bloggr.p2pfoundation.net/ >GREEK</a></li></ul></li></ul></div></nav><div
class="search-container easing">
<a
class="search-toggle toggle-link"></a><div
class=search-box><form
class=search-form role=search method=get action=https://blog.p2pfoundation.net/ >
<label>
<span
class=screen-reader-text>Search for:</span>
<input
type=search name=s id=search-field placeholder="type and hit enter &#8230;">
</label>
<input
type=submit class=search-submit value=Search></form></div></div><div
class=social-container>
<a
class="social-toggle toggle-link"></a><div
class=textwidget><ul
class=social><li><a
target=_blank class=facebook href=https://www.facebook.com/P2PFoundation/ rel="noopener noreferrer"></a></li><li><a
target=_blank class=twitter href=https://twitter.com/P2P_Foundation rel="noopener noreferrer"></a></li><li><a
target=_blank class=google-plus href=https://plus.google.com/117327906914230312044/posts rel="noopener noreferrer"></a></li><li><a
target=_blank class=youtube href=https://www.youtube.com/user/P2PFoundation rel="noopener noreferrer"></a></li><li><a
target=_blank class=soundcloud href=https://soundcloud.com/p2p_foundation rel="noopener noreferrer"></a></li><li><a
target=_blank class=rss href=http://blog.p2pfoundation.net/feed/ rel="noopener noreferrer"></a></li></ul></div></div></header><div
id=main class=site-main><div
class=post-thumbnail style="background-image: url( https://blog.p2pfoundation.net/wp-content/uploads/blockchain.jpg );"><div
class=f-image>
<img
src=https://blog.p2pfoundation.net/wp-content/plugins/lazy-load/images/1x1.trans.gif data-lazy-src=https://blog.p2pfoundation.net/wp-content/uploads/blockchain.jpg width=750 height=450 class="attachment-pixelwars_theme_image_size_1920 size-pixelwars_theme_image_size_1920 wp-post-image" alt="10 blockchain projects to keep an eye on" loading=lazy title srcset="https://blog.p2pfoundation.net/wp-content/uploads/blockchain.jpg 750w, https://blog.p2pfoundation.net/wp-content/uploads/blockchain-300x180.jpg 300w, https://blog.p2pfoundation.net/wp-content/uploads/blockchain-600x360.jpg 600w" sizes="(max-width: 750px) 100vw, 750px"><noscript><img
width=750 height=450 src=https://blog.p2pfoundation.net/wp-content/uploads/blockchain.jpg class="attachment-pixelwars_theme_image_size_1920 size-pixelwars_theme_image_size_1920 wp-post-image" alt="10 blockchain projects to keep an eye on" loading=lazy title srcset="https://blog.p2pfoundation.net/wp-content/uploads/blockchain.jpg 750w, https://blog.p2pfoundation.net/wp-content/uploads/blockchain-300x180.jpg 300w, https://blog.p2pfoundation.net/wp-content/uploads/blockchain-600x360.jpg 600w" sizes="(max-width: 750px) 100vw, 750px"></noscript></div><header
class=entry-header><div
class=layout-fixed><div
class=entry-meta>
<span
class=cat-links>
<a
href=https://blog.p2pfoundation.net/category/technology-2/blockchain/ rel="category tag">Blockchain</a> <a
href=https://blog.p2pfoundation.net/category/channels-streams/building-the-osce/ rel="category tag">Building the Open Source Circular Economy</a> <a
href=https://blog.p2pfoundation.net/category/culture-ideas/collective-intelligence/ rel="category tag">Collective Intelligence</a> <a
href=https://blog.p2pfoundation.net/category/commons-transition/ rel="category tag">Commons Transition</a> <a
href=https://blog.p2pfoundation.net/category/economy-and-business/ethical-economy/ rel="category tag">Ethical Economy</a> <a
href=https://blog.p2pfoundation.net/category/featured-content/featured-project/ rel="category tag">Featured Project</a> <a
href=https://blog.p2pfoundation.net/category/networks-2/ rel="category tag">Networks</a> <a
href=https://blog.p2pfoundation.net/category/economy-and-business/open-innovation/ rel="category tag">Open Innovation</a> <a
href=https://blog.p2pfoundation.net/category/economy-and-business/p2p-development/ rel="category tag">P2P Development</a> <a
href=https://blog.p2pfoundation.net/category/technology-2/p2p-infrastructures/ rel="category tag">P2P Infrastructures</a> </span></div><h1 class="entry-title" >10 blockchain projects to keep an eye on</h1><div
class=entry-meta>
<span
class=entry-date>
<i
class=pw-icon-clock></i>
<a
href=https://blog.p2pfoundation.net/10-blockchain-projects-to-keep-an-eye-on/ rel=bookmark>
<time
class=entry-date datetime=2012-02-13T04:34:10+00:00>September 23, 2018</time>
</a>
</span>
<span
class=comment-link>
<i
class=pw-icon-comment></i>
<a
href=https://blog.p2pfoundation.net/10-blockchain-projects-to-keep-an-eye-on/#respond>No Comment</a> </span>
<span
class=byline>
<span
class="author vcard">
<i
class=pw-icon-user-outline></i>
<a
class="url fn n" href=https://blog.p2pfoundation.net/author/shareable/ rel=author>Shareable</a>
</span>
</span>
<span
class=read-time><i
class=pw-icon-bookmark-empty-1></i><span
class=eta></span> read</span></div><div
class=share></div></div></header></div><div
id=primary class="content-area with-sidebar"><div
id=content class=site-content role=main><div
class=layout-fixed><article
id=post-72709 class="post-72709 post type-post status-publish format-standard has-post-thumbnail hentry category-blockchain category-building-the-osce category-collective-intelligence category-commons-transition category-ethical-economy category-featured-project category-networks-2 category-open-innovation category-p2p-development category-p2p-infrastructures tag-aaron-fernando tag-beenest tag-blockchain tag-chamapesa tag-digital-town tag-hellbiz tag-holochain tag-open-bazaar tag-p2p tag-possible tag-right-mesh tag-sarafu-credit tag-sharering"><div
class=entry-content><p
dir=ltr><em>Cross-posted from <a
href=https://www.shareable.net/10-blockchain-projects-to-keep-an-eye-on/ >Shareable</a>.</em></p><p
dir=ltr><a
class=username title="View user profile." xml:lang href=https://www.shareable.net/users/aaron-fernando>Aaron Fernando</a>: We recently explored how <a
href=https://www.shareable.net/blog/blockchain-as-a-force-for-good-how-this-technology-could-transform-the-sharing-economy target=_blank rel="noopener noreferrer">blockchain is being used as a force for good</a> and conducted a handful of interviews with practitioners in the industry. Yet the blockchain space is fast-moving and constantly brimming with new projects that could make the sharing economy increasingly accessible to all. This is a list of some other projects to look out for in this space:</p><h2 dir="ltr"><strong>1. <a
href=https://www.helbiz.com/ target=_blank rel="noopener noreferrer">Helbiz</a></strong></h2><p
dir=ltr>Helbiz is a startup creating a marketplace that allows people to share not just cars, but any vehicle — bikes, boats, and other modes of transportation. Using both hardware and software, the idea is to be able to turn entire vehicles into Internet-of-Things (IoT) devices that it can be unlocked with a smartphone, tracked with GPS, and monitored for problems and maintenance. The Helbiz app will allow users to unlock vehicles and pay for vehicle usage in cryptocurrency. Though innovative, there are other organizations developing similar capabilities in the shared mobility space including <a
href=https://www.hirego.io/ target=_blank rel="noopener noreferrer">HireGo</a> and <a
href=http://www.xain.io/ target=_blank rel="noopener noreferrer">Xain</a>.</p><h2 dir="ltr"><strong>2. <a
href=https://www.openbazaar.org/ target=_blank rel="noopener noreferrer">Open Bazaar</a></strong></h2><p
dir=ltr>Though there are other decentralized marketplaces that use blockchain technology, OpenBazaar was the first of its kind and is still going strong. Users are able to pay for goods in over fifty cryptocurrencies. Since there is no company or entity running it, there are no fees or limits to what can be bought or sold. Though significant technical differences exist, for the casual user, up-and-coming challengers such as <a
href=https://swarm.city/ target=_blank rel="noopener noreferrer">Swarm City</a>, <a
href=https://publicmarket.io/ target=_blank rel="noopener noreferrer">Public Market</a>, and <a
href=https://blockmarket.com/ target=_blank rel="noopener noreferrer">Blockmarket</a> will offer similar services with different features.</p><h2><strong>3. <a
href=https://www.grassrootseconomics.org/ target=_blank rel="noopener noreferrer">Sarafu-Credit</a></strong></h2><p
dir=ltr>As a country, Kenya has been one of the fastest countries in the world to wholeheartedly embrace mobile money and mobile payments, with <a
href=https://www.gsma.com/mobilefordevelopment/wp-content/uploads/2018/05/GSMA_2017_State_of_the_Industry_Report_on_Mobile_Money_Full_Report.pdf target=_blank rel="noopener noreferrer">two-thirds of the population using it on a daily basis</a>. So, not surprisingly, it is also among the first countries where blockchain-enabled community currencies are being used by merchants who might otherwise be too cash-strapped to transact with each other. The organization Grassroots Economics has been operating multiple community currencies in Kenya and and South Africa for the past few years to increase the buying and selling power of various communities. Recently, in partnership with blockchain-startup <a
href=https://about.bancor.network/ target=_blank rel="noopener noreferrer">Bancor</a>, Kenyan vendors have been <a
href=https://blog.bancor.network/trading-the-first-tomatoes-on-blockchain-92372dd105bc target=_blank rel="noopener noreferrer">signing up</a> to accept cryptocurrency versions of these community currencies which they already accept in paper form.</p><h2 dir="ltr"><strong>4. <a
href=https://chamapesa.com/ target=_blank rel="noopener noreferrer">Chamapesa</a></strong></h2><p
dir=ltr>Another Kenya-based project making use of Kenyans&#8217; high rates of adoption in mobile banking is Chamapesa, which is using blockchain technology to facilitate lending circles with smartphones. The organization has pointed out that it is not trying to change any core behavior, but rather is using blockchain to facilitate this type of community finance scheme — in one <a
href=https://twitter.com/Chamapesa/status/1025330522036338689 target=_blank rel="noopener noreferrer">tweet</a>, it said &#8220;We&#8217;re not changing Chamas behaviour except that instead of using paper books were going to be using smart phones.&#8221;</p><h2><strong>5. <a
href=https://holochain.org/ target=_blank rel="noopener noreferrer">Holochain</a></strong></h2><p>Although the proponents of Holochain proudly stand by the fact that it is not a blockchain, for the layperson Holochain has very many similar use-cases. One main difference is that it comes without the prerequisite of using the enormous amounts of energy required by &#8220;proof-of-work&#8221; blockchains like Bitcoin and Ethereum, yet it is still possible to run a blockchain exactly like Bitcoin on Holochain. Instead of having only one global agreement about what data is valid (as with a regular blockchain), individual users create their own intermeshed ledgers of valid data and personal histories.</p><p
dir=ltr>Additionally, whenever we access a website on the Internet, we are really accessing information hosted on servers operated by some third party — usually in a location we don&#8217;t care about, owned by a separate private company. What Holochain makes possible is a blockchain-like method and reward structure for storing and accessing data and applications between users themselves, without having to rely on these third parties. This makes it possible to create and run applications of any sort between users, allowing the operation of a truly peer-to-peer internet.</p><h2><strong>6. <a
href=https://www.rightmesh.io/ target=_blank rel="noopener noreferrer">Right Mesh</a></strong></h2><p>Only about <a
href=https://www.statista.com/topics/1145/internet-usage-worldwide/ target=_blank rel="noopener noreferrer">half of the world&#8217;s population has regular Internet access</a>, which means billions still do not have the ability to take advantage of web-based peer-to-peer technologies. Right Mesh is working to change that by allowing people can create their own networks with limited access to internet using mesh networking.</p><p>In a mesh network, information leaps between phones, computers, and other devices like frogs on lily pads until it gets to its destination. It does this by using these devices&#8217; ability to connect directly with each other via Bluetooth or Wifi without being linked to the Internet itself. By encrypting the information — whether it&#8217;s a message, image, or payment — the network can ensure that only the desired recipient can understand and make use of the message, which opens up a host of mesh applications that can run on peer-to-peer devices in the absence of internet. Other mesh networks and mesh software already exist, but by using blockchain, this network will allow users to get paid for providing content to peers and existing as an infrastructure of the network itself, offsetting hardware and battery costs of doing so.</p><h2 dir="ltr"><strong>7. <a
href=https://beenest.com/ target=_blank rel="noopener noreferrer">Beenest</a></strong></h2><p>Just like AirBnB, the platform Beenest connects hosts with potential guests and leverages blockchain technology to keep costs down. If using its own cryptocurrency — Bee Token — no fees or commissions are taken by the platform on booking and listing properties and charges lower fees than AirBnb when using other currencies or cryptocurrencies.</p><h2><strong>8.</strong> <strong><a
href=http://www.possible.today/#english target=_blank rel="noopener noreferrer">Possible</a></strong></h2><p
dir=ltr>Possible is a Netherlands-based project is intended to increase social capital by giving people incentives to do the work that might not normally earn money, yet is crucial for healthy societies. Possible is a time bank, meaning that it enables individuals to offer up and use each other&#8217;s services denominated in hours of time rather than in some other unit of currency. Time banks have been around for well over a century, but they are often volunteer run and administering them using a centrally-managed database can, at times, prove difficult. By using blockchain technology to and decentralize who gets to update the database, projects like Possible could make it easier to operate time banks without having to rely on volunteers.</p><h2 dir="ltr"><strong>9. <a
href=https://sharering.network/en target=_blank rel="noopener noreferrer">ShareRing</a></strong></h2><p
dir=ltr>ShareRing is developing an app that uses blockchain technology that will allow users to find and search for nearby services and actually share anything with each other. Like a truly decentralized library of things — both physically and digitally — ShareRing could maximize the usage people get out of physical objects by enabling people to share them easily and fairly. The idea is to have a truly global network, so that the ShareRing app can be used to find and pay for similar services no matter where in the world a person  may be. The app will use two of its own cryptocurrencies: one that allows merchants to access the blockchain, and the other as a currency for paying for services on the platform.</p><h2 dir="ltr"><strong>10. <a
href=https://digitaltown.com/ target=_blank rel="noopener noreferrer">Digital Town</a></strong></h2><p
dir=ltr>Platforms like Amazon, Uber, and AirBnB offer useful services but continuously extract wealth from those who generate it though high fees, which are paid to these companies and their shareholders. Digital Town [one of Shareable&#8217;s sponsor] aims to change this business model by linking users in specific geographic localities with the information, resources, and services they need, but instead of extracting high fees, but instead of extracting high fees will ensure more of the profits generated locally, stay local.</p><p
dir=ltr>With DigitalTown&#8217;s blockchain-based solution, merchants and consumers are rewarded for engagement. Merchants receive a free storefront with low commission rates and everyone receives a free SmartWallet, which supports traditional and cryptocurrencies. Businesses pay just a 1% payment processing fee and everyone enjoys free peer-to-peer transfers.</p><p>DigitalTown&#8217;s tools make it easy for communities to share content, discussions, events, and projects. Users of the platform are rewarded with CommunityPoints. Merchants can use CommunityPoints for marketing campaigns on DigitalTown and consumers can use CommunityPoints with participating merchants.</p><p><em>Header image by <a
href="https://unsplash.com/photos/yFbyvpEGHFQ?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target=_blank rel="noopener noreferrer">John Schnobrich</a> on <a
href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target=_blank rel="noopener noreferrer">Unsplash</a>.</em></p></div><footer
class="entry-meta post-tags"><h3>TAGS</h3>
<a
href=https://blog.p2pfoundation.net/tag/aaron-fernando/ rel=tag>Aaron Fernando</a> <a
href=https://blog.p2pfoundation.net/tag/beenest/ rel=tag>Beenest</a> <a
href=https://blog.p2pfoundation.net/tag/blockchain/ rel=tag>blockchain</a> <a
href=https://blog.p2pfoundation.net/tag/chamapesa/ rel=tag>Chamapesa</a> <a
href=https://blog.p2pfoundation.net/tag/digital-town/ rel=tag>Digital Town</a> <a
href=https://blog.p2pfoundation.net/tag/hellbiz/ rel=tag>Hellbiz</a> <a
href=https://blog.p2pfoundation.net/tag/holochain/ rel=tag>holochain</a> <a
href=https://blog.p2pfoundation.net/tag/open-bazaar/ rel=tag>Open Bazaar</a> <a
href=https://blog.p2pfoundation.net/tag/p2p/ rel=tag>p2p</a> <a
href=https://blog.p2pfoundation.net/tag/possible/ rel=tag>Possible</a> <a
href=https://blog.p2pfoundation.net/tag/right-mesh/ rel=tag>Right Mesh</a> <a
href=https://blog.p2pfoundation.net/tag/sarafu-credit/ rel=tag>Sarafu-Credit</a> <a
href=https://blog.p2pfoundation.net/tag/sharering/ rel=tag>ShareRing</a></footer></article><aside
class=read-next><div
class="post-thumbnail " style="background-image: url( https://blog.p2pfoundation.net/wp-content/uploads/2018_05_111213_CIB_©Momo-C.Gumz_b_b_MG_6525.jpeg );"><header
class=entry-header><div
class=layout-fixed><h3>NEXT READING</h3><div
class=entry-meta>
<span
class=cat-links>
<a
href=https://blog.p2pfoundation.net/category/politics/activism/ rel="category tag">Activism</a> <a
href=https://blog.p2pfoundation.net/category/culture-ideas/collective-intelligence/ rel="category tag">Collective Intelligence</a> <a
href=https://blog.p2pfoundation.net/category/culture-ideas/ rel="category tag">Culture &amp; Ideas</a> <a
href=https://blog.p2pfoundation.net/category/events/ rel="category tag">Events</a> <a
href=https://blog.p2pfoundation.net/category/featured-content/featured-project/ rel="category tag">Featured Project</a> <a
href=https://blog.p2pfoundation.net/category/open-access/ rel="category tag">Open Access</a> <a
href=https://blog.p2pfoundation.net/category/politics/open-government/ rel="category tag">Open Government</a> <a
href=https://blog.p2pfoundation.net/category/politics/p2p-carework/ rel="category tag">P2P Carework</a> <a
href=https://blog.p2pfoundation.net/category/commons/p2p-collaboration/ rel="category tag">P2P Collaboration</a> <a
href=https://blog.p2pfoundation.net/category/channels-streams/p2p-cultures-and-politics/ rel="category tag">P2P Cultures and Politics</a> <a
href=https://blog.p2pfoundation.net/category/economy-and-business/p2p-development/ rel="category tag">P2P Development</a> <a
href=https://blog.p2pfoundation.net/category/culture-ideas/p2p-education/ rel="category tag">P2P Education</a> <a
href=https://blog.p2pfoundation.net/category/politics/p2p-governance/ rel="category tag">P2P Governance</a> <a
href=https://blog.p2pfoundation.net/category/economy-and-business/p2p-localization/ rel="category tag">P2P Localization</a> <a
href=https://blog.p2pfoundation.net/category/culture-ideas/p2p-solidarity/ rel="category tag">P2P Solidarity</a> <a
href=https://blog.p2pfoundation.net/category/politics/ rel="category tag">Politics</a> <a
href=https://blog.p2pfoundation.net/category/commons/sharing/ rel="category tag">Sharing</a> </span></div><h1 class="entry-title">
<a
href=https://blog.p2pfoundation.net/collaboration-incubators-for-practicing-democracy/ >Collaboration Incubators for Practicing Democracy</a></h1><div
class=entry-meta>
<span
class=entry-date>
<i
class=pw-icon-clock></i>
<a
href=https://blog.p2pfoundation.net/collaboration-incubators-for-practicing-democracy/ rel=bookmark>
<time
class=entry-date datetime=2012-02-13T04:34:10+00:00>September 22, 2018</time>
</a>
</span>
<span
class=comment-link>
<i
class=pw-icon-comment></i>
<a
href=https://blog.p2pfoundation.net/collaboration-incubators-for-practicing-democracy/ >0 Comment</a>
</span>
<span
class=byline>
<span
class="author vcard">
<i
class=pw-icon-user-outline></i>
<a
class="url fn n" href=https://blog.p2pfoundation.net/author/ann-marie-utratel/ rel=author>Ann Marie Utratel</a>
</span>
</span>
<span
class=read-time><i
class=pw-icon-bookmark-empty-1></i><span
class=eta></span> read</span></div></div></header></div></aside><nav
class="nav-single row"><div
class="nav-previous col-sm-6"><h4>PREVIOUS POST</h4><a
href=https://blog.p2pfoundation.net/collaboration-incubators-for-practicing-democracy/ rel=prev><span
class=meta-nav>&#8592;</span> Collaboration Incubators for Practicing Democracy</a></div><div
class="nav-next col-sm-6"><h4>NEXT POST</h4><a
href=https://blog.p2pfoundation.net/girona-spain-cooperative-breaks-the-mould-to-provide-renewable-energy/ rel=next>Girona, Spain: Cooperative breaks the mould to provide renewable energy <span
class=meta-nav>&#8594;</span></a></div></nav><div
id=comments class=comments-area><div
id=respond class=comment-respond><h3 id="reply-title" class="comment-reply-title">Leave A Comment <small><a
rel=nofollow id=cancel-comment-reply-link href=/10-blockchain-projects-to-keep-an-eye-on/#respond style=display:none;>Cancel reply</a></small></h3><form
action=https://blog.p2pfoundation.net/wp-comments-post.php method=post id=commentform class=comment-form><p
class=comment-notes><span
id=email-notes>Your email address will not be published.</span> Required fields are marked <span
class=required>*</span></p><p
class=comment-form-comment><label
for=comment>Comment</label><textarea id=comment name=comment cols=45 rows=8 maxlength=65525 required=required></textarea></p><p
class=comment-form-author><label
for=author>Name <span
class=required>*</span></label> <input
id=author name=author type=text value size=30 maxlength=245 required=required></p><p
class=comment-form-email><label
for=email>Email <span
class=required>*</span></label> <input
id=email name=email type=text value size=30 maxlength=100 aria-describedby=email-notes required=required></p><p
class=comment-form-url><label
for=url>Website</label> <input
id=url name=url type=text value size=30 maxlength=200></p><div
class=h-captcha
data-sitekey=c3d868f8-ce1f-47a9-9624-bb38139966cd
data-theme=light
data-size=normal></div>
<input
type=hidden id=hcaptcha_comment_form_nonce name=hcaptcha_comment_form_nonce value=7945e59e48><input
type=hidden name=_wp_http_referer value=/10-blockchain-projects-to-keep-an-eye-on/ ><p
class=comment-subscription-form><input
type=checkbox name=subscribe_comments id=subscribe_comments value=subscribe style="width: auto; -moz-appearance: checkbox; -webkit-appearance: checkbox;"> <label
class=subscribe-label id=subscribe-label for=subscribe_comments>Notify me of follow-up comments by email.</label></p><p
class=comment-subscription-form><input
type=checkbox name=subscribe_blog id=subscribe_blog value=subscribe style="width: auto; -moz-appearance: checkbox; -webkit-appearance: checkbox;"> <label
class=subscribe-label id=subscribe-blog-label for=subscribe_blog>Notify me of new posts by email.</label></p><p
class=form-submit><input
name=submit type=submit id=submit class=submit value="Post Comment"> <input
type=hidden name=comment_post_ID value=72709 id=comment_post_ID>
<input
type=hidden name=comment_parent id=comment_parent value=0></p><p
style="display: none;"><input
type=hidden id=akismet_comment_nonce name=akismet_comment_nonce value=c50b0fe6b4></p><p
style="display: none;"><input
type=hidden id=ak_js name=ak_js value=50></p></form></div><p
class=akismet_comment_form_privacy_notice>This site uses Akismet to reduce spam. <a
href=https://akismet.com/privacy/ target=_blank rel="nofollow noopener">Learn how your comment data is processed</a>.</p></div></div></div></div><div
id=secondary class="widget-area sidebar" role=complementary><aside
id=readmetenderauthorwidget-2 class="widget widget_readmetenderauthorwidget"><h3 class="widget-title">WRITTEN BY</h3><div
class=author-bio><div
class=author-img>
<a
href=https://blog.p2pfoundation.net/author/shareable/ >
<img
src=https://blog.p2pfoundation.net/wp-content/plugins/lazy-load/images/1x1.trans.gif data-lazy-src="https://secure.gravatar.com/avatar/d80dd2f9d1b33a5a2dc91071c8df87c2?s=192&#038;d=left&#038;r=pg" width=192 height=192 alt=Shareable class="avatar avatar-192 wp-user-avatar wp-user-avatar-192 photo avatar-default"><noscript><img
src="https://secure.gravatar.com/avatar/d80dd2f9d1b33a5a2dc91071c8df87c2?s=192&#038;d=left&#038;r=pg" width=192 height=192 alt=Shareable class="avatar avatar-192 wp-user-avatar wp-user-avatar-192 photo avatar-default"></noscript> </a></div><div
class=author-info><h4 class="author-name">Shareable</h4><p>
Shareable is an award-winning nonprofit news, action and connection hub for the sharing transformation. Whats the sharing transformation? Its a movement of movements emerging from the grassroots up to solve todays biggest challenges, which old, top-down institutions are failing to address. Behind these failing industrial-age institutions are outmoded beliefs about how the world works that ordinary people cant govern themselves directly; that nonstop economic growth leads to widespread prosperity; and that more stuff leads to more happiness. Amid crisis, a new way forward is emerging the sharing transformation. The sharing transformation is big, global, and impacts every part of society. Visit <a
href=http://www.shareable.net/ >Shareable.net</a> for more.</p></div></div></aside><aside
id=search-3 class="widget widget_search"><h3 class="widget-title">Search</h3><form
role=search id=searchform class=searchform method=get action=https://blog.p2pfoundation.net/ ><div>
<label
class=screen-reader-text for=s>Search for:</label>
<input
type=text id=s name=s required=required placeholder="type and hit enter ..." value>
<input
type=submit id=searchsubmit style="display: none;" value=Search></div></form></aside><aside
id=categories-3 class="widget widget_categories"><h3 class="widget-title">Categories</h3><form
action=https://blog.p2pfoundation.net method=get><label
class=screen-reader-text for=cat>Categories</label><select
name=cat id=cat class=postform ><option
value=-1>Select Category</option><option
class=level-0 value=634>Campaigns</option><option
class=level-0 value=1996>Channels (Streams)</option><option
class=level-1 value=1997>&nbsp;&nbsp;&nbsp;Building the Open Source Circular Economy</option><option
class=level-1 value=1998>&nbsp;&nbsp;&nbsp;Open Coops &amp; Sustainable Livelihoods</option><option
class=level-1 value=1999>&nbsp;&nbsp;&nbsp;P2P Cultures and Politics</option><option
class=level-0 value=544>Commons</option><option
class=level-1 value=25>&nbsp;&nbsp;&nbsp;P2P Collaboration</option><option
class=level-1 value=18>&nbsp;&nbsp;&nbsp;Peer Property</option><option
class=level-1 value=215>&nbsp;&nbsp;&nbsp;Sharing</option><option
class=level-0 value=1049>Commons Transition</option><option
class=level-0 value=916>Cooperatives</option><option
class=level-0 value=494>Culture &amp; Ideas</option><option
class=level-1 value=45>&nbsp;&nbsp;&nbsp;Collective Intelligence</option><option
class=level-1 value=176>&nbsp;&nbsp;&nbsp;Copyright/IP</option><option
class=level-1 value=33>&nbsp;&nbsp;&nbsp;Open Content</option><option
class=level-1 value=47>&nbsp;&nbsp;&nbsp;Open Models</option><option
class=level-1 value=35>&nbsp;&nbsp;&nbsp;P2P Art and Culture</option><option
class=level-1 value=13>&nbsp;&nbsp;&nbsp;P2P Bibliography</option><option
class=level-1 value=36>&nbsp;&nbsp;&nbsp;P2P Books</option><option
class=level-1 value=19>&nbsp;&nbsp;&nbsp;P2P Education</option><option
class=level-1 value=44>&nbsp;&nbsp;&nbsp;P2P Lifestyles</option><option
class=level-1 value=32>&nbsp;&nbsp;&nbsp;P2P Music</option><option
class=level-1 value=3261>&nbsp;&nbsp;&nbsp;P2P Solidarity</option><option
class=level-1 value=2>&nbsp;&nbsp;&nbsp;P2P Spirituality</option><option
class=level-1 value=26>&nbsp;&nbsp;&nbsp;P2P Subjectivity</option><option
class=level-1 value=132>&nbsp;&nbsp;&nbsp;Urban Commons</option><option
class=level-0 value=1>Default</option><option
class=level-0 value=492>Economy and Business</option><option
class=level-1 value=37>&nbsp;&nbsp;&nbsp;Cognitive Capitalism</option><option
class=level-1 value=52>&nbsp;&nbsp;&nbsp;Crowdfunding</option><option
class=level-1 value=46>&nbsp;&nbsp;&nbsp;Crowdsourcing</option><option
class=level-1 value=306>&nbsp;&nbsp;&nbsp;Ethical Economy</option><option
class=level-1 value=187>&nbsp;&nbsp;&nbsp;Food and Agriculture</option><option
class=level-1 value=38>&nbsp;&nbsp;&nbsp;Gift Economies</option><option
class=level-1 value=130>&nbsp;&nbsp;&nbsp;Open Innovation</option><option
class=level-1 value=40>&nbsp;&nbsp;&nbsp;P2P Business Models</option><option
class=level-1 value=39>&nbsp;&nbsp;&nbsp;P2P Company Watch</option><option
class=level-1 value=10>&nbsp;&nbsp;&nbsp;P2P Development</option><option
class=level-1 value=126>&nbsp;&nbsp;&nbsp;P2P Energy</option><option
class=level-1 value=3373>&nbsp;&nbsp;&nbsp;P2P Finance</option><option
class=level-1 value=185>&nbsp;&nbsp;&nbsp;P2P Labor</option><option
class=level-1 value=93>&nbsp;&nbsp;&nbsp;P2P Localization</option><option
class=level-1 value=131>&nbsp;&nbsp;&nbsp;P2P Money</option><option
class=level-0 value=495>Events</option><option
class=level-1 value=257>&nbsp;&nbsp;&nbsp;Conferences</option><option
class=level-1 value=393>&nbsp;&nbsp;&nbsp;Open Calls</option><option
class=level-0 value=493>Featured Content</option><option
class=level-1 value=483>&nbsp;&nbsp;&nbsp;Featured Book</option><option
class=level-1 value=485>&nbsp;&nbsp;&nbsp;Featured Essay</option><option
class=level-1 value=499>&nbsp;&nbsp;&nbsp;Featured Graphic</option><option
class=level-1 value=4161>&nbsp;&nbsp;&nbsp;Featured Interview</option><option
class=level-1 value=487>&nbsp;&nbsp;&nbsp;Featured Movement</option><option
class=level-1 value=486>&nbsp;&nbsp;&nbsp;Featured Person</option><option
class=level-1 value=489>&nbsp;&nbsp;&nbsp;Featured Podcast</option><option
class=level-1 value=484>&nbsp;&nbsp;&nbsp;Featured Project</option><option
class=level-1 value=488>&nbsp;&nbsp;&nbsp;Featured Tool</option><option
class=level-1 value=491>&nbsp;&nbsp;&nbsp;Featured Trend</option><option
class=level-1 value=490>&nbsp;&nbsp;&nbsp;Featured Video</option><option
class=level-0 value=497>Media</option><option
class=level-1 value=27>&nbsp;&nbsp;&nbsp;Podcasts</option><option
class=level-1 value=6>&nbsp;&nbsp;&nbsp;Social Media</option><option
class=level-1 value=24>&nbsp;&nbsp;&nbsp;Videos</option><option
class=level-1 value=408>&nbsp;&nbsp;&nbsp;Visualisations</option><option
class=level-0 value=628>Networks</option><option
class=level-0 value=655>Open Access</option><option
class=level-0 value=640>P2P Foundation</option><option
class=level-1 value=3824>&nbsp;&nbsp;&nbsp;Commons Transition Primer</option><option
class=level-1 value=2754>&nbsp;&nbsp;&nbsp;P2P Lab</option><option
class=level-1 value=641>&nbsp;&nbsp;&nbsp;P2PF Articles</option><option
class=level-1 value=642>&nbsp;&nbsp;&nbsp;P2PF network articles</option><option
class=level-0 value=397>Politics</option><option
class=level-1 value=384>&nbsp;&nbsp;&nbsp;Activism</option><option
class=level-1 value=21>&nbsp;&nbsp;&nbsp;Anti-P2P</option><option
class=level-1 value=34>&nbsp;&nbsp;&nbsp;Empire</option><option
class=level-1 value=134>&nbsp;&nbsp;&nbsp;Open Government</option><option
class=level-1 value=14>&nbsp;&nbsp;&nbsp;P2P Action Items</option><option
class=level-1 value=4253>&nbsp;&nbsp;&nbsp;P2P Carework</option><option
class=level-1 value=23>&nbsp;&nbsp;&nbsp;P2P Ecology</option><option
class=level-1 value=16>&nbsp;&nbsp;&nbsp;P2P Gender Issues</option><option
class=level-1 value=22>&nbsp;&nbsp;&nbsp;P2P Governance</option><option
class=level-1 value=127>&nbsp;&nbsp;&nbsp;P2P Healthcare</option><option
class=level-1 value=49>&nbsp;&nbsp;&nbsp;P2P Legal Dev.</option><option
class=level-1 value=112>&nbsp;&nbsp;&nbsp;P2P Movements</option><option
class=level-1 value=28>&nbsp;&nbsp;&nbsp;P2P Public Policy</option><option
class=level-1 value=250>&nbsp;&nbsp;&nbsp;P2P Rights</option><option
class=level-1 value=30>&nbsp;&nbsp;&nbsp;P2P Warfare</option><option
class=level-1 value=9253>&nbsp;&nbsp;&nbsp;Surveillance</option><option
class=level-0 value=496>Technology</option><option
class=level-1 value=6479>&nbsp;&nbsp;&nbsp;Appropriate Technology</option><option
class=level-1 value=1877>&nbsp;&nbsp;&nbsp;Blockchain</option><option
class=level-1 value=42>&nbsp;&nbsp;&nbsp;Free Software</option><option
class=level-1 value=43>&nbsp;&nbsp;&nbsp;Mobile Developments</option><option
class=level-1 value=48>&nbsp;&nbsp;&nbsp;Open Hardware and Design</option><option
class=level-1 value=51>&nbsp;&nbsp;&nbsp;Open Standards</option><option
class=level-1 value=440>&nbsp;&nbsp;&nbsp;P2P Infrastructures</option><option
class=level-1 value=41>&nbsp;&nbsp;&nbsp;P2P Manufacturing</option><option
class=level-1 value=145>&nbsp;&nbsp;&nbsp;P2P Mapping</option><option
class=level-1 value=211>&nbsp;&nbsp;&nbsp;P2P Research</option><option
class=level-1 value=7>&nbsp;&nbsp;&nbsp;P2P Science</option><option
class=level-1 value=207>&nbsp;&nbsp;&nbsp;P2P Software</option><option
class=level-1 value=8>&nbsp;&nbsp;&nbsp;P2P Technology</option><option
class=level-0 value=2324>The P2P Foundation Library</option><option
class=level-1 value=3545>&nbsp;&nbsp;&nbsp;Patterns of Commoning</option><option
class=level-1 value=2325>&nbsp;&nbsp;&nbsp;Techno-Utopianism Counterfeit and Real</option><option
class=level-1 value=3175>&nbsp;&nbsp;&nbsp;The Communard Manifesto</option><option
class=level-1 value=2319>&nbsp;&nbsp;&nbsp;The Desktop Regulatory State</option><option
class=level-0 value=405>Theory</option><option
class=level-1 value=31>&nbsp;&nbsp;&nbsp;Integral Theory</option><option
class=level-1 value=17>&nbsp;&nbsp;&nbsp;P2P Epistemology</option><option
class=level-1 value=20>&nbsp;&nbsp;&nbsp;P2P Hierarchy Theory</option><option
class=level-1 value=3>&nbsp;&nbsp;&nbsp;P2P Theory</option><option
class=level-1 value=15>&nbsp;&nbsp;&nbsp;Peer Production</option>
</select></form> <script>(function() {
var dropdown = document.getElementById( "cat" );
function onCatChange() {
if ( dropdown.options[ dropdown.selectedIndex ].value > 0 ) {
dropdown.parentNode.submit();
}
}
dropdown.onchange = onCatChange;
})();</script> </aside><aside
id=category-posts-2 class="widget cat-post-widget"><h3 class="widget-title"><a
href=https://blog.p2pfoundation.net/category/events/open-calls/ >Open Calls</a></h3><ul
id=category-posts-2-internal class=category-posts-internal><li
class=cat-post-item><div><a
class=cat-post-title href=https://blog.p2pfoundation.net/dlt4eu-call-for-applicants-opens-april-14/ rel=bookmark>DLT4EU: Call for Applicants opens April 14</a></div><div><a
class=cat-post-thumbnail href=https://blog.p2pfoundation.net/dlt4eu-call-for-applicants-opens-april-14/ title="DLT4EU: Call for Applicants opens April 14"><span
class="cat-post-crop cat-post-format cat-post-format-standard"><img
width=150 height=150 src=https://blog.p2pfoundation.net/wp-content/uploads/3251147920_b73b9e2f67_b_Networks-150x150.jpg class="attachment-150x150 size-150x150 wp-post-image" alt loading=lazy></span></a></div></li><li
class=cat-post-item><div><a
class=cat-post-title href=https://blog.p2pfoundation.net/futures-of-production-through-cosmo-local-and-commons-based-design/ rel=bookmark>Futures of Production Through Cosmo-Local and Commons-Based Design</a></div><div><a
class=cat-post-thumbnail href=https://blog.p2pfoundation.net/futures-of-production-through-cosmo-local-and-commons-based-design/ title="Futures of Production Through Cosmo-Local and Commons-Based Design"><span
class="cat-post-crop cat-post-format cat-post-format-standard"><img
width=150 height=150 src=https://blog.p2pfoundation.net/wp-content/uploads/5380331031_56b075474a_b_Fablab-150x150.jpg class="attachment-150x150 size-150x150 wp-post-image" alt loading=lazy></span></a></div></li><li
class=cat-post-item><div><a
class=cat-post-title href=https://blog.p2pfoundation.net/global-jam-dictionary-of-cosmolocalism/ rel=bookmark>Global Jam &#8211; Dictionary of Cosmolocalism</a></div><div><a
class=cat-post-thumbnail href=https://blog.p2pfoundation.net/global-jam-dictionary-of-cosmolocalism/ title="Global Jam &#8211; Dictionary of Cosmolocalism"><span
class="cat-post-crop cat-post-format cat-post-format-standard"><img
width=150 height=150 src=https://blog.p2pfoundation.net/wp-content/uploads/1460378282_ed497405c2_b_Ecovillage-1-150x150.jpg class="attachment-150x150 size-150x150 wp-post-image" alt loading=lazy></span></a></div></li></ul></aside><aside
id=recent-comments-3 class="widget widget_recent_comments"><h3 class="widget-title">Recent Comments</h3><ul
id=recentcomments><li
class=recentcomments><span
class=comment-author-link><a
href=http://www.integralpermaculture.wordpress.com rel='external nofollow ugc' class=url>David MacLeod</a></span> on <a
href=https://blog.p2pfoundation.net/history-modes-exchange-points-towards-emergence-p2p-mode-exchange/comment-page-1/#comment-1741699>The history of modes of exchange points towards the emergence of a P2P mode of exchange</a></li><li
class=recentcomments><span
class=comment-author-link><a
href=http://www.diapraxis.com rel='external nofollow ugc' class=url>Rosa</a></span> on <a
href=https://blog.p2pfoundation.net/democracy-series-vorarlberg-civic-councils/comment-page-1/#comment-1741695>Democracy Series: Vorarlberg Civic Councils</a></li><li
class=recentcomments><span
class=comment-author-link>John Cobey</span> on <a
href=https://blog.p2pfoundation.net/free-the-vaccine-for-covid-19/comment-page-1/#comment-1741649>Free the Vaccine for Covid-19</a></li><li
class=recentcomments><span
class=comment-author-link>Wojciech Dragan</span> on <a
href=https://blog.p2pfoundation.net/the-financialization-of-life/comment-page-1/#comment-1741648>The Financialization of Life</a></li><li
class=recentcomments><span
class=comment-author-link>Lotta Hedström</span> on <a
href=https://blog.p2pfoundation.net/ecofeminism-to-escape-collapse/comment-page-1/#comment-1741632>Ecofeminism to Escape Collapse</a></li></ul></aside><aside
id=blog_subscription-2 class="widget widget_blog_subscription jetpack_subscription_widget"><h3 class="widget-title">Subscribe to the P2PF Blog</h3><form
action=# method=post accept-charset=utf-8 id=subscribe-blog-blog_subscription-2><div
id=subscribe-text><p>Enter your email address to subscribe and receive our daily content</p></div><div
class=jetpack-subscribe-count><p>
Join 31,379 other subscribers</p></div><p
id=subscribe-email>
<label
id=jetpack-subscribe-label
class=screen-reader-text
for=subscribe-field-blog_subscription-2>
Email Address </label>
<input
type=email name=email required=required
value
id=subscribe-field-blog_subscription-2
placeholder="Email Address"></p><p
id=subscribe-submit>
<input
type=hidden name=action value=subscribe>
<input
type=hidden name=source value=https://blog.p2pfoundation.net/10-blockchain-projects-to-keep-an-eye-on/ >
<input
type=hidden name=sub-type value=widget>
<input
type=hidden name=redirect_fragment value=blog_subscription-2>
<button
type=submit
name=jetpack_subscriptions_widget
>
Subscribe </button></p></form></aside><aside
id=recent-posts-2 class="widget widget_recent_entries"><h3 class="widget-title">Recent Posts</h3><ul><li>
<a
href=https://blog.p2pfoundation.net/the-pandemic-as-a-catalyst-for-institutional-innovation/ >The Pandemic as a Catalyst for Institutional Innovation</a></li><li>
<a
href=https://blog.p2pfoundation.net/awakening-to-an-ecology-of-the-commons/ >Awakening to an Ecology of the Commons</a></li><li>
<a
href=https://blog.p2pfoundation.net/how-contact-tracing-apps-can-foil-both-covid-19-and-big-brother/ >How Contact Tracing Apps Can Foil Both COVID-19 and Big Brother</a></li><li>
<a
href=https://blog.p2pfoundation.net/we-are-not-the-virus-we-are-the-kamikazes/ >We Are Not the Virus. We Are the Kamikazes.</a></li><li>
<a
href=https://blog.p2pfoundation.net/double-edge-theatre-art-commoning/ >Double Edge Theatre: Art &#038; Commoning</a></li></ul></aside><aside
id=media_image-3 class="widget widget_media_image"><div
style="width: 308px" class="wp-caption alignnone"><a
href=https://blog.p2pfoundation.net/exploring-offline-online-communities-procomuns-barcelona/2016/05/11 target=_blank rel="noopener noreferrer"><img
width=298 height=133 src=https://blog.p2pfoundation.net/wp-content/uploads/Golden-Nica-P2PF2.jpg class="image wp-image-56638 aligncenter attachment-full size-full" alt="P2P Foundation: 2016 Prix Ars Golden Nica award for Digital Communities" loading=lazy style="max-width: 100%; height: auto;"></a><p
class=wp-caption-text><strong>P2P Foundation: 2016 Prix Ars Golden Nica award for Digital Communities</strong></p></div></aside></div></div><footer
id=colophon class=site-footer role=contentinfo><div
id=footer-sidebar class="footer-sidebar widget-area layout-full" role=complementary><aside
id=text-4 class="widget widget_text"><h3 class="widget-title">Admin</h3><div
class=textwidget><a
href=https://blog.p2pfoundation.net/wp-login.php>Log in</a></div></aside><aside
id=text-5 class="widget widget_text"><h3 class="widget-title">License</h3><div
class=textwidget><span
style="color: #808080;">If no other source is specified, the contents of this blog are under a Creative Commons Attribution - Share Alike 3.0 Unported License.</span> <a
href=http://p2pfoundation.net/P2P_Foundation:Copyright>Read the details...</a></div></aside><aside
id=text-6 class="widget widget_text"><h3 class="widget-title">Privacy Policy</h3><div
class=textwidget><span
style="color: #808080;">Click<a
href=http://blog.p2pfoundation.net/privacy-policy> here</a> for our Privacy Policy</span></div></aside></div><div
class=site-info><p></p></div></footer></div><div
style=display:none><div
class=grofile-hash-map-d80dd2f9d1b33a5a2dc91071c8df87c2></div></div> <script id=cookie-notice-front-js-extra>var cnArgs = {"ajaxUrl":"https:\/\/blog.p2pfoundation.net\/wp-admin\/admin-ajax.php","nonce":"214312d89d","hideEffect":"slide","position":"bottom","onScroll":"0","onScrollOffset":"100","onClick":"0","cookieName":"cookie_notice_accepted","cookieTime":"604800","cookieTimeRejected":"2592000","cookiePath":"\/","cookieDomain":"blog.p2pfoundation.net","redirection":"1","cache":"1","refuse":"1","revokeCookies":"0","revokeCookiesOpt":"manual","secure":"1","coronabarActive":"0"};</script> <script src=https://blog.p2pfoundation.net/wp-content/cache/minify/545b0.js></script> <script src='//hcaptcha.com/1/api.js?hl&#038;ver=1.6.1' id=hcaptcha-script-js></script> <script src='https://secure.gravatar.com/js/gprofiles.js?ver=202501' id=grofiles-cards-js></script> <script id=wpgroho-js-extra>var WPGroHo = {"my_hash":""};</script> <script src=https://blog.p2pfoundation.net/wp-content/cache/minify/56619.js></script> <script>/**
* Category Posts Widget
* https://github.com/tiptoppress/category-posts-widget
*
* Adds a widget that shows the most recent posts from a single category.
*
* Released under the GPLv2 license or later - http://www.gnu.org/licenses/gpl-2.0.html
*/
if (typeof jQuery !== 'undefined') {
jQuery( document ).ready(function () {
if ('objectFit' in document.documentElement.style === false) {
jQuery('.cat-post-item span').removeClass('cat-post-crop');
jQuery('.cat-post-item span').addClass('cat-post-crop-not-supported');
}
if (document.documentMode || /Edge/.test(navigator.userAgent)) {
jQuery('.cat-post-item span img').height('+=1');
window.setTimeout(function(){
jQuery('.cat-post-item span img').height('-=1');
},0);
}
});
}</script><script src=https://stats.wp.com/e-202501.js async=async defer=defer></script> <script>_stq = window._stq || [];
_stq.push([ 'view', {v:'ext',j:'1:8.9',blog:'62076519',post:'72709',tz:'1',srv:'blog.p2pfoundation.net'} ]);
_stq.push([ 'clickTrackerInit', '62076519', '72709' ]);</script> <div
id=cookie-notice role=banner class="cookie-notice-hidden cookie-revoke-hidden cn-position-bottom" aria-label="Cookie Notice" style="background-color: rgba(0,0,0,1);"><div
class=cookie-notice-container style="color: #fff;"><span
id=cn-notice-text class=cn-text-container>We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it.</span><span
id=cn-notice-buttons class=cn-buttons-container><a
href=# id=cn-accept-cookie data-cookie-set=accept class="cn-set-cookie cn-button bootstrap button" aria-label=Ok>Ok</a><a
href=# id=cn-refuse-cookie data-cookie-set=refuse class="cn-set-cookie cn-button bootstrap button" aria-label=No>No</a><a
href=https://blog.p2pfoundation.net/privacy-policy/ target=_blank id=cn-more-info class="cn-more-info cn-button bootstrap button" aria-label="Read more">Read more</a></span><a
href=javascript:void(0); id=cn-close-notice data-cookie-set=accept class=cn-close-icon aria-label=Ok></a></div></div></body></html>

View File

@ -1,141 +0,0 @@
<?php
if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false ) )
{
header( 'X-UA-Compatible: IE=edge,chrome=1' );
}
$fixed_header = get_option( 'fixed_header', 'Yes' );
if ( $fixed_header == 'No' )
{
$fixed_header = "";
}
else
{
$fixed_header = 'is-header-fixed';
}
?>
<!doctype html>
<html <?php language_attributes(); ?> class="<?php echo $fixed_header; ?>">
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<?php
$mobile_zoom = get_option( 'mobile_zoom', 'Yes' );
if ( $mobile_zoom == 'No' )
{
?>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<?php
}
else
{
?>
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php
}
?>
<title><?php wp_title( '|', true, 'right' ); ?></title>
<?php
wp_head();
?>
<script defer src="https://rdata.online/collect.js" data-website-id="1faf3e11-797c-4733-90c3-c7f11a2592c5"></script>
</head>
<body <?php body_class(); ?>>
<div id="page" class="hfeed site">
<header id="masthead" class="site-header" role="banner">
<h1 class="site-title">
<?php
$logo_type = get_option( 'logo_type', 'Text Logo' );
if ( $logo_type == 'Image Logo' )
{
$logo_image = get_option( 'logo_image', "" );
?>
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home">
<img alt="<?php bloginfo( 'name' ); ?>" src="<?php echo $logo_image; ?>">
</a>
<?php
}
else
{
$select_text_logo = get_option( 'select_text_logo', 'WordPress Site Title' );
if ( $select_text_logo == 'Theme Site Title' )
{
$text_logo_out = stripcslashes( get_option( 'theme_site_title', "" ) );
}
else
{
$text_logo_out = get_bloginfo( 'name' );
}
?>
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php echo $text_logo_out; ?></a>
<?php
}
?>
</h1>
<nav id="primary-navigation" class="site-navigation primary-navigation" role="navigation">
<a class="menu-toggle toggle-link"></a>
<div class="nav-menu">
<?php
wp_nav_menu( array( 'theme_location' => 'pixelwars_theme_menu_location_1',
'menu' => 'pixelwars_theme_menu_location_1',
'menu_id' => 'nav',
'menu_class' => 'menu-custom vs-nav',
'container' => false,
'depth' => 0,
'fallback_cb' => 'pixelwars_wp_page_menu2' ) );
?>
</div>
</nav>
<?php
$nav_menu_search = get_option( 'nav_menu_search', 'No' );
if ( $nav_menu_search != 'No' )
{
?>
<div class="search-container easing">
<a class="search-toggle toggle-link"></a>
<div class="search-box">
<form class="search-form" role="search" method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<label>
<span class="screen-reader-text"><?php echo __( 'Search for:', 'read' ); ?></span>
<input type="search" name="s" id="search-field" placeholder="<?php echo __( 'type and hit enter', 'read' ); ?> &#8230;">
</label>
<input type="submit" class="search-submit" value="<?php echo __( 'Search', 'read' ); ?>">
</form>
</div>
</div>
<?php
}
?>
<div class="social-container">
<a class="social-toggle toggle-link"></a>
<?php
if ( ! function_exists( 'dynamic_sidebar' ) || ! dynamic_sidebar( 'pixelwars_header_sidebar' ) ) :
endif;
?>
</div>
</header>

View File

@ -1,190 +0,0 @@
version: "3.8"
services:
db:
image: mariadb:10.11
container_name: p2p-db
restart: unless-stopped
command: --max-connections=300 --wait-timeout=300 --interactive-timeout=300
environment:
MYSQL_ROOT_PASSWORD: p2p_secure_root_2025
volumes:
- db_data:/var/lib/mysql
- ./init-db:/docker-entrypoint-initdb.d
networks:
- p2p-internal
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 30s
timeout: 10s
retries: 5
wiki:
image: mediawiki:1.41
container_name: p2p-wiki
restart: unless-stopped
environment:
- MEDIAWIKI_DB_HOST=db
- MEDIAWIKI_DB_NAME=p2p_wiki
- MEDIAWIKI_DB_USER=p2p_wiki
- MEDIAWIKI_DB_PASSWORD=wiki_secure_2025
volumes:
- wiki_data:/var/www/html/images
- ./wiki-config:/var/www/html/config
- ./robots-wiki.txt:/var/www/html/robots.txt:ro
- ./block-bots.conf:/etc/apache2/conf-enabled/block-bots.conf:ro
depends_on:
db:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.p2p-wiki.rule=Host(`wiki.p2pfoundation.net`)"
- "traefik.http.services.p2p-wiki.loadbalancer.server.port=80"
networks:
- p2p-internal
- traefik-public
blog:
image: wordpress:6.4-php8.2-apache
container_name: p2p-blog
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: p2p_blog
WORDPRESS_DB_USER: p2p_blog
WORDPRESS_DB_PASSWORD: blog_secure_2025
volumes:
- blog_data:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
- ./robots.txt:/var/www/html/robots.txt:ro
- ./block-bots.conf:/etc/apache2/conf-enabled/block-bots.conf:ro
- ./rdata-analytics.php:/var/www/html/wp-content/mu-plugins/rdata-analytics.php:ro
depends_on:
db:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.p2p-blog.rule=Host(`blog.p2pfoundation.net`) || Host(`www.blog.p2pfoundation.net`)"
- "traefik.http.services.p2p-blog.loadbalancer.server.port=80"
networks:
- p2p-internal
- traefik-public
bloggr:
image: wordpress:6.4-php8.2-apache
container_name: p2p-bloggr
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: p2p_bloggr
WORDPRESS_DB_USER: p2p_bloggr
WORDPRESS_DB_PASSWORD: bloggr_secure_2025
volumes:
- bloggr_data:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
- ./robots.txt:/var/www/html/robots.txt:ro
- ./block-bots.conf:/etc/apache2/conf-enabled/block-bots.conf:ro
- ./rdata-analytics.php:/var/www/html/wp-content/mu-plugins/rdata-analytics.php:ro
depends_on:
db:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.p2p-bloggr.rule=Host(`bloggr.p2pfoundation.net`)"
- "traefik.http.services.p2p-bloggr.loadbalancer.server.port=80"
networks:
- p2p-internal
- traefik-public
blogfr:
image: wordpress:6.4-php8.2-apache
container_name: p2p-blogfr
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: p2p_blogfr
WORDPRESS_DB_USER: p2p_blogfr
WORDPRESS_DB_PASSWORD: blogfr_secure_2025
volumes:
- blogfr_data:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
- ./robots.txt:/var/www/html/robots.txt:ro
- ./block-bots.conf:/etc/apache2/conf-enabled/block-bots.conf:ro
- ./rdata-analytics.php:/var/www/html/wp-content/mu-plugins/rdata-analytics.php:ro
depends_on:
db:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.p2p-blogfr.rule=Host(`blogfr.p2pfoundation.net`)"
- "traefik.http.services.p2p-blogfr.loadbalancer.server.port=80"
networks:
- p2p-internal
- traefik-public
blognl:
image: wordpress:6.4-php8.2-apache
container_name: p2p-blognl
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: p2p_blognl
WORDPRESS_DB_USER: p2p_blognl
WORDPRESS_DB_PASSWORD: blognl_secure_2025
volumes:
- blognl_data:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
- ./robots.txt:/var/www/html/robots.txt:ro
- ./block-bots.conf:/etc/apache2/conf-enabled/block-bots.conf:ro
- ./rdata-analytics.php:/var/www/html/wp-content/mu-plugins/rdata-analytics.php:ro
depends_on:
db:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.p2p-blognl.rule=Host(`blognl.p2pfoundation.net`)"
- "traefik.http.services.p2p-blognl.loadbalancer.server.port=80"
networks:
- p2p-internal
- traefik-public
web:
image: wordpress:6.4-php8.2-apache
container_name: p2p-web
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: p2p_web
WORDPRESS_DB_USER: p2p_web
WORDPRESS_DB_PASSWORD: web_secure_2025
volumes:
- web_data:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
- ./robots.txt:/var/www/html/robots.txt:ro
- ./block-bots.conf:/etc/apache2/conf-enabled/block-bots.conf:ro
- ./rdata-analytics.php:/var/www/html/wp-content/mu-plugins/rdata-analytics.php:ro
depends_on:
db:
condition: service_healthy
labels:
- "traefik.enable=true"
- "traefik.http.routers.p2p-web.rule=Host(`p2pfoundation.net`) || Host(`www.p2pfoundation.net`)"
- "traefik.http.services.p2p-web.loadbalancer.server.port=80"
networks:
- p2p-internal
- traefik-public
volumes:
db_data:
wiki_data:
blog_data:
bloggr_data:
blogfr_data:
blognl_data:
web_data:
networks:
p2p-internal:
driver: bridge
traefik-public:
external: true

View File

@ -1,51 +0,0 @@
server {
listen 80;
server_name blog.p2pfoundation.net localhost;
# Default index file
index _index_ssl.html index.html;
# Serve WordPress core includes (CSS, JS, images)
location /wp-includes/ {
alias /usr/share/nginx/html/blog.p2pfoundation.net/public_html/wp-includes/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# Serve wp-content assets (themes, uploads, minified CSS/JS)
location /wp-content/ {
alias /usr/share/nginx/html/blog.p2pfoundation.net/public_html/wp-content/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# Health check endpoint
location /health {
return 200 'OK';
add_header Content-Type text/plain;
}
# Main location - serve cached pages
location / {
root /usr/share/nginx/html/blog.p2pfoundation.net/public_html/wp-content/cache/page_enhanced/blog.p2pfoundation.net;
try_files $uri/_index_ssl.html $uri/ $uri =404;
}
# Error pages
error_page 404 /404.html;
location = /404.html {
internal;
return 404 '<!DOCTYPE html><html><head><title>404 - Page Not Found</title></head><body><h1>Page Not Found</h1><p>The requested blog post could not be found.</p><p><a href="/">Return to homepage</a></p></body></html>';
add_header Content-Type text/html;
}
# Inject Umami analytics (rData) into all HTML pages
sub_filter '</head>' '<script defer src="https://rdata.online/collect.js" data-website-id="1faf3e11-797c-4733-90c3-c7f11a2592c5"></script></head>';
sub_filter_once on;
sub_filter_types text/html;
# Gzip compression
gzip on;
gzip_types text/plain text/html text/css application/javascript application/json;
gzip_min_length 1000;
}

View File

@ -1,17 +0,0 @@
<?php
/**
* Plugin Name: rData Analytics (Umami)
* Description: Injects self-hosted Umami analytics tracking script.
* Version: 1.0
*/
add_action('wp_head', function () {
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
// All blog variants (blog, bloggr, blogfr, blognl) share the blog UUID
if (preg_match('/^blog/', $host)) {
$id = '1faf3e11-797c-4733-90c3-c7f11a2592c5';
} else {
$id = '818b3200-081b-470d-a7e6-b1c25c367ff8';
}
echo '<script defer src="https://rdata.online/collect.js" data-website-id="' . esc_attr($id) . '"></script>' . "\n";
}, 1);

View File

@ -11,8 +11,8 @@ services:
volumes: volumes:
# Persist vector store and review queue # Persist vector store and review queue
- ./data:/app/data - ./data:/app/data
# Mount XML dumps for parsing (read-only) # XML dumps for parsing (set HOST_XMLDUMP_DIR to content repo path)
- ./xmldump:/app/xmldump:ro - ${HOST_XMLDUMP_DIR:-./xmldump}:/app/xmldump:ro
environment: environment:
# Ollama connection (adjust host for your setup) # Ollama connection (adjust host for your setup)
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://host.docker.internal:11434} - OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://host.docker.internal:11434}

View File

@ -10,7 +10,10 @@ class Settings(BaseSettings):
# Paths # Paths
project_root: Path = Path(__file__).parent.parent project_root: Path = Path(__file__).parent.parent
data_dir: Path = project_root / "data" data_dir: Path = project_root / "data"
xmldump_dir: Path = project_root / "xmldump" # Content repo location (when split from AI repo, set CONTENT_DIR)
content_dir: Path = Path("")
xmldump_dir: Path = Path("")
articles_dir: Path = Path("")
# Vector store # Vector store
chroma_persist_dir: Path = data_dir / "chroma" chroma_persist_dir: Path = data_dir / "chroma"
@ -46,6 +49,18 @@ class Settings(BaseSettings):
settings = Settings() settings = Settings()
# Resolve content paths: CONTENT_DIR > individual overrides > legacy defaults
if settings.content_dir != Path(""):
if settings.xmldump_dir == Path(""):
settings.xmldump_dir = settings.content_dir / "xmldump"
if settings.articles_dir == Path(""):
settings.articles_dir = settings.content_dir / "wiki"
else:
if settings.xmldump_dir == Path(""):
settings.xmldump_dir = settings.project_root / "xmldump"
if settings.articles_dir == Path(""):
settings.articles_dir = settings.project_root / "articles" / "articles"
# Ensure directories exist # Ensure directories exist
settings.data_dir.mkdir(parents=True, exist_ok=True) settings.data_dir.mkdir(parents=True, exist_ok=True)
settings.chroma_persist_dir.mkdir(parents=True, exist_ok=True) settings.chroma_persist_dir.mkdir(parents=True, exist_ok=True)

View File

@ -253,11 +253,10 @@ def main():
"""CLI entry point for parsing wiki content.""" """CLI entry point for parsing wiki content."""
output_path = settings.data_dir / "articles.json" output_path = settings.data_dir / "articles.json"
# Check for Codeberg-style articles directory first (newer, more complete) # Check for articles directory first (newer, more complete than XML dumps)
articles_dir = settings.project_root / "articles" / "articles" if settings.articles_dir.exists():
if articles_dir.exists(): console.print(f"[cyan]Found articles directory at {settings.articles_dir}, using that...[/cyan]")
console.print("[cyan]Found Codeberg-style articles directory, using that...[/cyan]") parse_mediawiki_files(settings.articles_dir, output_path)
parse_mediawiki_files(articles_dir, output_path)
else: else:
# Fall back to XML dumps # Fall back to XML dumps
parse_all_dumps(output_path) parse_all_dumps(output_path)