# How to Track Progress and Completion Across Multiple Platforms in Open Source CS

> Learn how to track progress and completion across multiple platforms for your open source CS projects. Enhance your README with a status column and optional automation.

- Repository: [Forrest Knight/open-source-cs](https://github.com/ForrestKnight/open-source-cs)
- Tags: how-to-guide
- Published: 2026-05-01

---

**Track progress and completion across multiple platforms by extending the [`README.md`](https://github.com/ForrestKnight/open-source-cs/blob/main/README.md) table in ForrestKnight/open-source-cs with a "Status" column containing emoji markers, optionally automated with a Python script.**

The ForrestKnight/open-source-cs repository provides a comprehensive computer science curriculum using free courses from edX, Coursera, and Udacity. Because each course lives on a different platform with its own tracking system, you need a unified method to monitor your journey. By augmenting the existing Markdown tables with progress markers, you create a single source of truth that remains version-controlled and portable.

## Extend the Curriculum Table with a Status Column

The repository stores all course listings in [`README.md`](https://github.com/ForrestKnight/open-source-cs/blob/main/README.md) using standard Markdown tables. To track progress and completion across multiple platforms, add a **"Status"** column to these existing tables. This approach preserves the canonical curriculum while adding personal tracking data that renders correctly on GitHub.

The column should contain self-contained progress widgets that are human-readable and machine-parseable. Use **declarative status symbols** to indicate state:

- **❌** – Not started
- **🕒** – In progress  
- **✅** – Completed

Because Markdown tables are plain text, this method works across all platforms without dependencies. The symbols render consistently on GitHub, GitLab, and any Markdown viewer, providing immediate visual feedback on your curriculum advancement.

Here is the modified table structure for the Programming section:

```markdown

## Programming

Courses | School | Duration | Effort | Frequency | Prerequisites | Status
:-- | :--: | :--: | :--: | :--: | :--: | :--:
[Java Programming: Solving Problems with Software](https://imp.i384100.net/GjkPGV) | Duke | 4 weeks | 4‑8 h/wk | twice a month | none | ❌
[Java Programming: Arrays, Lists, and Structured Data](https://imp.i384100.net/15knRR) | Duke | 4 weeks | 4‑8 h/wk | twice a month | Java Programming: Solving Problems with Software | 🕒
[Object Oriented Programming in Java](https://imp.i384100.net/ZdznBq) | Duke | 6 weeks | 4‑6 h/wk | weekly | Java Programming: Arrays, Lists, and Structured Data | ✅

```

## Automate Status Updates with Python

Manually editing emoji markers across multiple courses becomes tedious. Use a **Python helper script** to programmatically toggle statuses in [`README.md`](https://github.com/ForrestKnight/open-source-cs/blob/main/README.md) based on course title matching.

The script reads the file, locates the row by exact course title using regex, and cycles the status symbol through the defined progression map. It requires no external dependencies beyond the Python standard library.

Create [`progress_updater.py`](https://github.com/ForrestKnight/open-source-cs/blob/main/progress_updater.py) in the repository root:

```python
import re
from pathlib import Path

FILE = Path("README.md")
STATUS_MAP = {"❌": "🕒", "🕒": "✅", "✅": "❌"}

def toggle_status(course_title: str) -> None:
    text = FILE.read_text()
    pattern = rf"(\[{re.escape(course_title)}\][^\n]*)\| ([❌🕒✅])"
    def repl(match):
        line, current = match.group(1), match.group(2)
        new = STATUS_MAP[current]
        return f"{line}| {new}"
    new_text, count = re.subn(pattern, repl, text, flags=re.MULTILINE)
    if count == 0:
        print("Course not found or status column missing.")
        return
    FILE.write_text(new_text)
    print(f"Updated status for '{course_title}' → {new}")

if __name__ == "__main__":
    toggle_status("Java Programming: Solving Problems with Software")

```

Run this script after finishing a module to instantly update your progress marker. The regex pattern specifically targets the course link and the trailing status column, ensuring it does not modify other table data or course descriptions.

## Link to External Trackers for Rich Data

When you need to store platform-specific metadata—such as Coursera grades, edX certificate URLs, or completion timestamps—use the Status column to link to external trackers.

Replace the emoji with a hyperlink to a Google Sheet, Notion page, or Airtable base where you maintain detailed records. This keeps the [`README.md`](https://github.com/ForrestKnight/open-source-cs/blob/main/README.md) file clean while providing access to granular data.

Example linking to a Google Sheet:

```markdown
| Courses | School | Duration | Status |
| :-- | :--: | :--: | :--: |
| [Data Structures and Performance](https://imp.i384100.net/oevm0b) | Duke | 6 weeks | [🕒](https://docs.google.com/spreadsheets/d/your-sheet-id/edit#gid=0) |

```

Clicking the status badge opens your external tracker where you can record platform-specific completion data, download certificates, or calculate cumulative study hours across different learning sites.

## Summary

- **Extend [`README.md`](https://github.com/ForrestKnight/open-source-cs/blob/main/README.md)** with a Status column using emoji markers (❌, 🕒, ✅) to track progress and completion across multiple platforms directly in the curriculum file.
- **Maintain a single source of truth** by keeping the canonical course list and personal progress data in the same version-controlled document.
- **Automate updates** using the provided Python script to cycle through status states without manual text editing.
- **Link externally** when you need detailed metrics, using the Status column as a gateway to rich tracking spreadsheets or databases.

## Frequently Asked Questions

### How do I track progress without modifying the original repository?

Fork the ForrestKnight/open-source-cs repository to your own GitHub account. In your fork, modify [`README.md`](https://github.com/ForrestKnight/open-source-cs/blob/main/README.md) to add the Status column. This preserves the ability to pull upstream updates while maintaining your personal progress data in a separate branch or committed directly to your fork's main branch.

### Can I automatically import completion status from Coursera or edX?

The repository does not provide direct API integration with learning platforms. However, you can extend the Python script to parse platform emails or exported CSV files from Coursera and edX, then match course titles against the [`README.md`](https://github.com/ForrestKnight/open-source-cs/blob/main/README.md) table to automatically update status markers when certificates are earned.

### What if I want to track additional metrics like study hours or grades?

Add additional columns to the right of the Status column in the Markdown table. For example, create "Hours Spent" and "Grade" columns. Because Markdown tables are plain text, you can extend the table structure indefinitely or link to external spreadsheets from the Status column for complex data that does not fit the table format.

### Is there a way to generate visual progress charts from this data?

Yes. Since [`README.md`](https://github.com/ForrestKnight/open-source-cs/blob/main/README.md) is plain text, you can create a GitHub Actions workflow ([`.github/workflows/progress.yml`](https://github.com/ForrestKnight/open-source-cs/blob/main/.github/workflows/progress.yml)) that parses the Status column counts on every commit. Generate a summary markdown file or SVG badge showing completion percentages by category (Core CS, Advanced CS, etc.) and commit it back to the repository for automatic visualization.