Repository files navigation

Derivative: An Open Source BP Debate Tracker

Currently live on derivative.lol. This is the back-end of a tracker designed for British Parliamentary debating, allowing users record and import results, view their history, and access summary statistics. The front-end is visible here

Built with Python, FastAPI, Pydantic, pandas, Uvicorn, scikit-learn, and Firebase. All code is made available under the GNU AGPLv3 license.

Features

  • Add debate results
  • Import from TabbyCat URLs
  • Track performance over time
  • View and manage history
  • User registration and authentication
  • Automatic motion categorisation

Planned

  • Improved motion categorisation model

Setup Instructions

These are new setup instructions using docker. This guide will assume you already have docker and docker-compose set up to work on your machine. Instructions can be found here, or you could ask a modern LLM, which should very much be able to guide you through the process.

This guide assumes you are using linux (or WSL).

Firebase Configuration

You will need firebase credentials as this project uses firebase for authentication.

  1. head to Firebase console
  2. create a new project, enable Authentication
  3. under project settings, go to the service accounts tab
  4. generate a new private key and rename it to serviceAccountKey.json. Do not share this with anyone.
  5. place this file in a folder
    mkdir /some/folder/i/remember/my-dv-secrets
    cp downloaded/path/to/serviceAccountKey.json some/folder/i/remember/my-dv-secrets/serviceAccountKey.json

Remember this folder's path, as you will need it in the future.

Motions JSON

This repository does not contain a list of motions to train the classifier model. I will not be providing instructions for getting a list of motions. However, I will assume you have a list of motions and topics in this format in your JSON:

{
"Motion": "This house supports capital controls restricting foreign currency during times of economic crises",
"Infoslide": "Capital controls are government policies that regulate the flow money across a country's border",
"Round": "Round 4",
"Types": [
"Economics",
"International Relations"
]
}

Remember the path to this JSON, as it will come in useful.

Docker Compose path setup

  1. Clone and enter the repository:
git clone https://github.com/vikwritescode/derivative
cd derivative
  1. Ensure that all of these directories/paths are ready

    • path to your motions (in json form)
    • path to your secrets folder
    • path to an (empty) artifacts folder where your model will live
  2. Find the blocks labelled volume and edit these lines accordingly wherever they exist:

    • - ${HOME}/dv-secrets:/run/secrets:ro,Z --> - your/secrets/folder:/run/secrets:ro,Z
    • - ${HOME}/dv-artifacts:/artifacts:Z --> - your/artifacts/folder:/artifacts:Z
    • ${HOME}/bp-debate-tracker/scraped_motions.json:/data/scraped_motions.json:ro,Z --> /your/path/to/motions.json:/data/scraped_motions.json:ro,Z

Training the model

  1. Run the training command using docker-compose:
docker compose run --rm trainer

This should generate three files in in your artifacts folder: classifier.pkl, multilabel_binarizer.pkl, and transformer.pkl

Running the service

  1. Run the server
docker compose up -d --remove-orphans

At this stage, the server should be up and running at localhost:8000

About

An Open Source BP Debate Tracker

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Derivative: An Open Source BP Debate Tracker

Currently live on derivative.lol. This is the back-end of a tracker designed for British Parliamentary debating, allowing users record and import results, view their history, and access summary statistics. The front-end is visible here

Built with Python, FastAPI, Pydantic, pandas, Uvicorn, scikit-learn, and Firebase. All code is made available under the GNU AGPLv3 license.

Features

  • Add debate results
  • Import from TabbyCat URLs
  • Track performance over time
  • View and manage history
  • User registration and authentication
  • Automatic motion categorisation

Planned

  • Improved motion categorisation model

Setup Instructions

These are new setup instructions using docker. This guide will assume you already have docker and docker-compose set up to work on your machine. Instructions can be found here, or you could ask a modern LLM, which should very much be able to guide you through the process.

This guide assumes you are using linux (or WSL).

Firebase Configuration

You will need firebase credentials as this project uses firebase for authentication.

  1. head to Firebase console
  2. create a new project, enable Authentication
  3. under project settings, go to the service accounts tab
  4. generate a new private key and rename it to serviceAccountKey.json. Do not share this with anyone.
  5. place this file in a folder
    mkdir /some/folder/i/remember/my-dv-secrets
    cp downloaded/path/to/serviceAccountKey.json some/folder/i/remember/my-dv-secrets/serviceAccountKey.json

Remember this folder's path, as you will need it in the future.

Motions JSON

This repository does not contain a list of motions to train the classifier model. I will not be providing instructions for getting a list of motions. However, I will assume you have a list of motions and topics in this format in your JSON:

{
"Motion": "This house supports capital controls restricting foreign currency during times of economic crises",
"Infoslide": "Capital controls are government policies that regulate the flow money across a country's border",
"Round": "Round 4",
"Types": [
"Economics",
"International Relations"
]
}

Remember the path to this JSON, as it will come in useful.

Docker Compose path setup

  1. Clone and enter the repository:
git clone https://github.com/vikwritescode/derivative
cd derivative
  1. Ensure that all of these directories/paths are ready

    • path to your motions (in json form)
    • path to your secrets folder
    • path to an (empty) artifacts folder where your model will live
  2. Find the blocks labelled volume and edit these lines accordingly wherever they exist:

    • - ${HOME}/dv-secrets:/run/secrets:ro,Z --> - your/secrets/folder:/run/secrets:ro,Z
    • - ${HOME}/dv-artifacts:/artifacts:Z --> - your/artifacts/folder:/artifacts:Z
    • ${HOME}/bp-debate-tracker/scraped_motions.json:/data/scraped_motions.json:ro,Z --> /your/path/to/motions.json:/data/scraped_motions.json:ro,Z

Training the model

  1. Run the training command using docker-compose:
docker compose run --rm trainer

This should generate three files in in your artifacts folder: classifier.pkl, multilabel_binarizer.pkl, and transformer.pkl

Running the service

  1. Run the server
docker compose up -d --remove-orphans

At this stage, the server should be up and running at localhost:8000

About

An Open Source BP Debate Tracker

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Derivative: An Open Source BP Debate Tracker

Currently live on derivative.lol. This is the back-end of a tracker designed for British Parliamentary debating, allowing users record and import results, view their history, and access summary statistics. The front-end is visible here

Built with Python, FastAPI, Pydantic, pandas, Uvicorn, scikit-learn, and Firebase. All code is made available under the GNU AGPLv3 license.

Features

  • Add debate results
  • Import from TabbyCat URLs
  • Track performance over time
  • View and manage history
  • User registration and authentication
  • Automatic motion categorisation

Planned

  • Improved motion categorisation model

Setup Instructions

These are new setup instructions using docker. This guide will assume you already have docker and docker-compose set up to work on your machine. Instructions can be found here, or you could ask a modern LLM, which should very much be able to guide you through the process.

This guide assumes you are using linux (or WSL).

Firebase Configuration

You will need firebase credentials as this project uses firebase for authentication.

  1. head to Firebase console
  2. create a new project, enable Authentication
  3. under project settings, go to the service accounts tab
  4. generate a new private key and rename it to serviceAccountKey.json. Do not share this with anyone.
  5. place this file in a folder
    mkdir /some/folder/i/remember/my-dv-secrets
    cp downloaded/path/to/serviceAccountKey.json some/folder/i/remember/my-dv-secrets/serviceAccountKey.json

Remember this folder's path, as you will need it in the future.

Motions JSON

This repository does not contain a list of motions to train the classifier model. I will not be providing instructions for getting a list of motions. However, I will assume you have a list of motions and topics in this format in your JSON:

{
"Motion": "This house supports capital controls restricting foreign currency during times of economic crises",
"Infoslide": "Capital controls are government policies that regulate the flow money across a country's border",
"Round": "Round 4",
"Types": [
"Economics",
"International Relations"
]
}

Remember the path to this JSON, as it will come in useful.

Docker Compose path setup

  1. Clone and enter the repository:
git clone https://github.com/vikwritescode/derivative
cd derivative
  1. Ensure that all of these directories/paths are ready

    • path to your motions (in json form)
    • path to your secrets folder
    • path to an (empty) artifacts folder where your model will live
  2. Find the blocks labelled volume and edit these lines accordingly wherever they exist:

    • - ${HOME}/dv-secrets:/run/secrets:ro,Z --> - your/secrets/folder:/run/secrets:ro,Z
    • - ${HOME}/dv-artifacts:/artifacts:Z --> - your/artifacts/folder:/artifacts:Z
    • ${HOME}/bp-debate-tracker/scraped_motions.json:/data/scraped_motions.json:ro,Z --> /your/path/to/motions.json:/data/scraped_motions.json:ro,Z

Training the model

  1. Run the training command using docker-compose:
docker compose run --rm trainer

This should generate three files in in your artifacts folder: classifier.pkl, multilabel_binarizer.pkl, and transformer.pkl

Running the service

  1. Run the server
docker compose up -d --remove-orphans

At this stage, the server should be up and running at localhost:8000

About

An Open Source BP Debate Tracker

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Derivative: An Open Source BP Debate Tracker

Currently live on derivative.lol. This is the back-end of a tracker designed for British Parliamentary debating, allowing users record and import results, view their history, and access summary statistics. The front-end is visible here

Built with Python, FastAPI, Pydantic, pandas, Uvicorn, scikit-learn, and Firebase. All code is made available under the GNU AGPLv3 license.

Features

  • Add debate results
  • Import from TabbyCat URLs
  • Track performance over time
  • View and manage history
  • User registration and authentication
  • Automatic motion categorisation

Planned

  • Improved motion categorisation model

Setup Instructions

These are new setup instructions using docker. This guide will assume you already have docker and docker-compose set up to work on your machine. Instructions can be found here, or you could ask a modern LLM, which should very much be able to guide you through the process.

This guide assumes you are using linux (or WSL).

Firebase Configuration

You will need firebase credentials as this project uses firebase for authentication.

  1. head to Firebase console
  2. create a new project, enable Authentication
  3. under project settings, go to the service accounts tab
  4. generate a new private key and rename it to serviceAccountKey.json. Do not share this with anyone.
  5. place this file in a folder
    mkdir /some/folder/i/remember/my-dv-secrets
    cp downloaded/path/to/serviceAccountKey.json some/folder/i/remember/my-dv-secrets/serviceAccountKey.json

Remember this folder's path, as you will need it in the future.

Motions JSON

This repository does not contain a list of motions to train the classifier model. I will not be providing instructions for getting a list of motions. However, I will assume you have a list of motions and topics in this format in your JSON:

{
"Motion": "This house supports capital controls restricting foreign currency during times of economic crises",
"Infoslide": "Capital controls are government policies that regulate the flow money across a country's border",
"Round": "Round 4",
"Types": [
"Economics",
"International Relations"
]
}

Remember the path to this JSON, as it will come in useful.

Docker Compose path setup

  1. Clone and enter the repository:
git clone https://github.com/vikwritescode/derivative
cd derivative
  1. Ensure that all of these directories/paths are ready

    • path to your motions (in json form)
    • path to your secrets folder
    • path to an (empty) artifacts folder where your model will live
  2. Find the blocks labelled volume and edit these lines accordingly wherever they exist:

    • - ${HOME}/dv-secrets:/run/secrets:ro,Z --> - your/secrets/folder:/run/secrets:ro,Z
    • - ${HOME}/dv-artifacts:/artifacts:Z --> - your/artifacts/folder:/artifacts:Z
    • ${HOME}/bp-debate-tracker/scraped_motions.json:/data/scraped_motions.json:ro,Z --> /your/path/to/motions.json:/data/scraped_motions.json:ro,Z

Training the model

  1. Run the training command using docker-compose:
docker compose run --rm trainer

This should generate three files in in your artifacts folder: classifier.pkl, multilabel_binarizer.pkl, and transformer.pkl

Running the service

  1. Run the server
docker compose up -d --remove-orphans

At this stage, the server should be up and running at localhost:8000

About

An Open Source BP Debate Tracker

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Derivative: An Open Source BP Debate Tracker

Currently live on derivative.lol. This is the back-end of a tracker designed for British Parliamentary debating, allowing users record and import results, view their history, and access summary statistics. The front-end is visible here

Built with Python, FastAPI, Pydantic, pandas, Uvicorn, scikit-learn, and Firebase. All code is made available under the GNU AGPLv3 license.

Features

  • Add debate results
  • Import from TabbyCat URLs
  • Track performance over time
  • View and manage history
  • User registration and authentication
  • Automatic motion categorisation

Planned

  • Improved motion categorisation model

Setup Instructions

These are new setup instructions using docker. This guide will assume you already have docker and docker-compose set up to work on your machine. Instructions can be found here, or you could ask a modern LLM, which should very much be able to guide you through the process.

This guide assumes you are using linux (or WSL).

Firebase Configuration

You will need firebase credentials as this project uses firebase for authentication.

  1. head to Firebase console
  2. create a new project, enable Authentication
  3. under project settings, go to the service accounts tab
  4. generate a new private key and rename it to serviceAccountKey.json. Do not share this with anyone.
  5. place this file in a folder
    mkdir /some/folder/i/remember/my-dv-secrets
    cp downloaded/path/to/serviceAccountKey.json some/folder/i/remember/my-dv-secrets/serviceAccountKey.json

Remember this folder's path, as you will need it in the future.

Motions JSON

This repository does not contain a list of motions to train the classifier model. I will not be providing instructions for getting a list of motions. However, I will assume you have a list of motions and topics in this format in your JSON:

{
"Motion": "This house supports capital controls restricting foreign currency during times of economic crises",
"Infoslide": "Capital controls are government policies that regulate the flow money across a country's border",
"Round": "Round 4",
"Types": [
"Economics",
"International Relations"
]
}

Remember the path to this JSON, as it will come in useful.

Docker Compose path setup

  1. Clone and enter the repository:
git clone https://github.com/vikwritescode/derivative
cd derivative
  1. Ensure that all of these directories/paths are ready

    • path to your motions (in json form)
    • path to your secrets folder
    • path to an (empty) artifacts folder where your model will live
  2. Find the blocks labelled volume and edit these lines accordingly wherever they exist:

    • - ${HOME}/dv-secrets:/run/secrets:ro,Z --> - your/secrets/folder:/run/secrets:ro,Z
    • - ${HOME}/dv-artifacts:/artifacts:Z --> - your/artifacts/folder:/artifacts:Z
    • ${HOME}/bp-debate-tracker/scraped_motions.json:/data/scraped_motions.json:ro,Z --> /your/path/to/motions.json:/data/scraped_motions.json:ro,Z

Training the model

  1. Run the training command using docker-compose:
docker compose run --rm trainer

This should generate three files in in your artifacts folder: classifier.pkl, multilabel_binarizer.pkl, and transformer.pkl

Running the service

  1. Run the server
docker compose up -d --remove-orphans

At this stage, the server should be up and running at localhost:8000

About

An Open Source BP Debate Tracker

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Derivative: An Open Source BP Debate Tracker

Currently live on derivative.lol. This is the back-end of a tracker designed for British Parliamentary debating, allowing users record and import results, view their history, and access summary statistics. The front-end is visible here

Built with Python, FastAPI, Pydantic, pandas, Uvicorn, scikit-learn, and Firebase. All code is made available under the GNU AGPLv3 license.

Features

  • Add debate results
  • Import from TabbyCat URLs
  • Track performance over time
  • View and manage history
  • User registration and authentication
  • Automatic motion categorisation

Planned

  • Improved motion categorisation model

Setup Instructions

These are new setup instructions using docker. This guide will assume you already have docker and docker-compose set up to work on your machine. Instructions can be found here, or you could ask a modern LLM, which should very much be able to guide you through the process.

This guide assumes you are using linux (or WSL).

Firebase Configuration

You will need firebase credentials as this project uses firebase for authentication.

  1. head to Firebase console
  2. create a new project, enable Authentication
  3. under project settings, go to the service accounts tab
  4. generate a new private key and rename it to serviceAccountKey.json. Do not share this with anyone.
  5. place this file in a folder
    mkdir /some/folder/i/remember/my-dv-secrets
    cp downloaded/path/to/serviceAccountKey.json some/folder/i/remember/my-dv-secrets/serviceAccountKey.json

Remember this folder's path, as you will need it in the future.

Motions JSON

This repository does not contain a list of motions to train the classifier model. I will not be providing instructions for getting a list of motions. However, I will assume you have a list of motions and topics in this format in your JSON:

{
"Motion": "This house supports capital controls restricting foreign currency during times of economic crises",
"Infoslide": "Capital controls are government policies that regulate the flow money across a country's border",
"Round": "Round 4",
"Types": [
"Economics",
"International Relations"
]
}

Remember the path to this JSON, as it will come in useful.

Docker Compose path setup

  1. Clone and enter the repository:
git clone https://github.com/vikwritescode/derivative
cd derivative
  1. Ensure that all of these directories/paths are ready

    • path to your motions (in json form)
    • path to your secrets folder
    • path to an (empty) artifacts folder where your model will live
  2. Find the blocks labelled volume and edit these lines accordingly wherever they exist:

    • - ${HOME}/dv-secrets:/run/secrets:ro,Z --> - your/secrets/folder:/run/secrets:ro,Z
    • - ${HOME}/dv-artifacts:/artifacts:Z --> - your/artifacts/folder:/artifacts:Z
    • ${HOME}/bp-debate-tracker/scraped_motions.json:/data/scraped_motions.json:ro,Z --> /your/path/to/motions.json:/data/scraped_motions.json:ro,Z

Training the model

  1. Run the training command using docker-compose:
docker compose run --rm trainer

This should generate three files in in your artifacts folder: classifier.pkl, multilabel_binarizer.pkl, and transformer.pkl

Running the service

  1. Run the server
docker compose up -d --remove-orphans

At this stage, the server should be up and running at localhost:8000

About

An Open Source BP Debate Tracker

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Derivative: An Open Source BP Debate Tracker

Currently live on derivative.lol. This is the back-end of a tracker designed for British Parliamentary debating, allowing users record and import results, view their history, and access summary statistics. The front-end is visible here

Built with Python, FastAPI, Pydantic, pandas, Uvicorn, scikit-learn, and Firebase. All code is made available under the GNU AGPLv3 license.

Features

  • Add debate results
  • Import from TabbyCat URLs
  • Track performance over time
  • View and manage history
  • User registration and authentication
  • Automatic motion categorisation

Planned

  • Improved motion categorisation model

Setup Instructions

These are new setup instructions using docker. This guide will assume you already have docker and docker-compose set up to work on your machine. Instructions can be found here, or you could ask a modern LLM, which should very much be able to guide you through the process.

This guide assumes you are using linux (or WSL).

Firebase Configuration

You will need firebase credentials as this project uses firebase for authentication.

  1. head to Firebase console
  2. create a new project, enable Authentication
  3. under project settings, go to the service accounts tab
  4. generate a new private key and rename it to serviceAccountKey.json. Do not share this with anyone.
  5. place this file in a folder
    mkdir /some/folder/i/remember/my-dv-secrets
    cp downloaded/path/to/serviceAccountKey.json some/folder/i/remember/my-dv-secrets/serviceAccountKey.json

Remember this folder's path, as you will need it in the future.

Motions JSON

This repository does not contain a list of motions to train the classifier model. I will not be providing instructions for getting a list of motions. However, I will assume you have a list of motions and topics in this format in your JSON:

{
"Motion": "This house supports capital controls restricting foreign currency during times of economic crises",
"Infoslide": "Capital controls are government policies that regulate the flow money across a country's border",
"Round": "Round 4",
"Types": [
"Economics",
"International Relations"
]
}

Remember the path to this JSON, as it will come in useful.

Docker Compose path setup

  1. Clone and enter the repository:
git clone https://github.com/vikwritescode/derivative
cd derivative
  1. Ensure that all of these directories/paths are ready

    • path to your motions (in json form)
    • path to your secrets folder
    • path to an (empty) artifacts folder where your model will live
  2. Find the blocks labelled volume and edit these lines accordingly wherever they exist:

    • - ${HOME}/dv-secrets:/run/secrets:ro,Z --> - your/secrets/folder:/run/secrets:ro,Z
    • - ${HOME}/dv-artifacts:/artifacts:Z --> - your/artifacts/folder:/artifacts:Z
    • ${HOME}/bp-debate-tracker/scraped_motions.json:/data/scraped_motions.json:ro,Z --> /your/path/to/motions.json:/data/scraped_motions.json:ro,Z

Training the model

  1. Run the training command using docker-compose:
docker compose run --rm trainer

This should generate three files in in your artifacts folder: classifier.pkl, multilabel_binarizer.pkl, and transformer.pkl

Running the service

  1. Run the server
docker compose up -d --remove-orphans

At this stage, the server should be up and running at localhost:8000

About

An Open Source BP Debate Tracker

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Derivative: An Open Source BP Debate Tracker

Currently live on derivative.lol. This is the back-end of a tracker designed for British Parliamentary debating, allowing users record and import results, view their history, and access summary statistics. The front-end is visible here

Built with Python, FastAPI, Pydantic, pandas, Uvicorn, scikit-learn, and Firebase. All code is made available under the GNU AGPLv3 license.

Features

  • Add debate results
  • Import from TabbyCat URLs
  • Track performance over time
  • View and manage history
  • User registration and authentication
  • Automatic motion categorisation

Planned

  • Improved motion categorisation model

Setup Instructions

These are new setup instructions using docker. This guide will assume you already have docker and docker-compose set up to work on your machine. Instructions can be found here, or you could ask a modern LLM, which should very much be able to guide you through the process.

This guide assumes you are using linux (or WSL).

Firebase Configuration

You will need firebase credentials as this project uses firebase for authentication.

  1. head to Firebase console
  2. create a new project, enable Authentication
  3. under project settings, go to the service accounts tab
  4. generate a new private key and rename it to serviceAccountKey.json. Do not share this with anyone.
  5. place this file in a folder
    mkdir /some/folder/i/remember/my-dv-secrets
    cp downloaded/path/to/serviceAccountKey.json some/folder/i/remember/my-dv-secrets/serviceAccountKey.json

Remember this folder's path, as you will need it in the future.

Motions JSON

This repository does not contain a list of motions to train the classifier model. I will not be providing instructions for getting a list of motions. However, I will assume you have a list of motions and topics in this format in your JSON:

{
"Motion": "This house supports capital controls restricting foreign currency during times of economic crises",
"Infoslide": "Capital controls are government policies that regulate the flow money across a country's border",
"Round": "Round 4",
"Types": [
"Economics",
"International Relations"
]
}

Remember the path to this JSON, as it will come in useful.

Docker Compose path setup

  1. Clone and enter the repository:
git clone https://github.com/vikwritescode/derivative
cd derivative
  1. Ensure that all of these directories/paths are ready

    • path to your motions (in json form)
    • path to your secrets folder
    • path to an (empty) artifacts folder where your model will live
  2. Find the blocks labelled volume and edit these lines accordingly wherever they exist:

    • - ${HOME}/dv-secrets:/run/secrets:ro,Z --> - your/secrets/folder:/run/secrets:ro,Z
    • - ${HOME}/dv-artifacts:/artifacts:Z --> - your/artifacts/folder:/artifacts:Z
    • ${HOME}/bp-debate-tracker/scraped_motions.json:/data/scraped_motions.json:ro,Z --> /your/path/to/motions.json:/data/scraped_motions.json:ro,Z

Training the model

  1. Run the training command using docker-compose:
docker compose run --rm trainer

This should generate three files in in your artifacts folder: classifier.pkl, multilabel_binarizer.pkl, and transformer.pkl

Running the service

  1. Run the server
docker compose up -d --remove-orphans

At this stage, the server should be up and running at localhost:8000

About

An Open Source BP Debate Tracker

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages