CCF-Deadlines TUI

May 1, 2026 · View on GitHub

A fast, interactive terminal user interface for tracking CCF-ranked conference deadlines with real-time countdown timers.

Python 3.10+ License: MIT Textual

CCF-Deadlines TUI Screenshot

Features

  • Real-time Countdown — Live countdown timers updating every second with color-coded urgency
  • Multi-dimensional Filtering — Filter by 10 categories, CCF ranks (A/B/C/N), CORE ranks (A*/A/B/C/N), and THCPL ranks (A/B/N)
  • Favorites System — Star conferences to pin them to the top; persists across sessions
  • Fuzzy Search — Smart search by conference title with relevance ranking
  • Bilingual Support — Toggle between English and Chinese interface
  • Vim-style Navigationj/k keys, g/G for top/bottom, familiar to power users
  • Direct URL Opening — Press Enter to open conference website in browser
  • Color-coded Ranks — Visual indicators: red for A-rank, yellow for B, green for C, dim for N
  • Auto-sorting — Favorites first → running by urgency → TBD → expired by year
  • Offline Fallback — Automatically falls back to local data when remote unavailable

Installation

Prerequisites

  • Python 3.10 or higher
  • pip package manager

Install from Source

git clone https://github.com/ccfddl/ccfddl-tui.git
cd ccfddl-tui
pip install -e .

Install with Development Dependencies

pip install -e ".[dev]"

Dependencies

PackagePurpose
textual>=0.47.0Terminal UI framework
pyyaml>=6.0YAML configuration parsing
requests>=2.28.0HTTP requests for remote data
python-dateutil>=2.8.0Flexible datetime parsing
rich>=13.0.0Rich text formatting

Usage

Basic Launch

ccfddl-tui

Custom Data Source

ccfddl-tui --url https://example.com/conferences.yml

Command Line Options

OptionDescription
--url URLCustom conference data URL (default: https://ccfddl.github.io/conference/allconf.yml)
--versionShow version number
--helpShow help message

Keyboard Shortcuts

KeyAction
j / Move down one row
k / Move up one row
gGo to first row
GGo to last row

Actions

KeyAction
EnterOpen selected conference URL in browser
fToggle favorite (★) for selected conference
lToggle language (English ↔ Chinese)
rRefresh data from source
qQuit application
?Show help screen

Filtering

ActionMethod
Filter by categoryClick checkboxes in sidebar
Filter by rankClick CCF/CORE/THCPL checkboxes
Search by titleType in search box
Show expiredToggle "Show Expired" checkbox
Clear searchPress Esc

Countdown Color Codes

ColorMeaning
🔴 RedLess than 1 day remaining
🟡 YellowLess than 7 days remaining
🔵 BlueLess than 30 days remaining
🟢 Green30+ days remaining

Rank Color Codes

RankColor
A / A*Red (bold for A*)
BYellow
CGreen
NDim

Project Structure

ccfddl-tui/
├── ccfddl_tui/
│   ├── __init__.py           # Package metadata
│   ├── main.py               # CLI entry point
│   ├── app.py                # Main TUI application
│   ├── models.py             # Conference data models
│   ├── styles.tcss           # Textual CSS styles
│   ├── data/
│   │   ├── __init__.py
│   │   └── data_service.py   # Data loading, filtering, sorting
│   ├── widgets/
│   │   ├── __init__.py
│   │   ├── conference_table.py   # Conference display table
│   │   ├── filters.py            # Filter sidebar widget
│   │   └── countdown.py          # Real-time countdown widget
│   └── utils/
│       ├── __init__.py
│       ├── formatters.py     # Countdown formatting utilities
│       └── timezone.py       # Timezone parsing utilities
├── tests/
│   ├── conftest.py           # Shared test fixtures
│   ├── test_app.py           # Application tests
│   ├── test_data_service.py  # Data layer tests
│   ├── test_filters.py       # Filter widget tests
│   ├── test_conference_table.py
│   ├── test_countdown.py
│   ├── test_favorites.py
│   └── test_extended_filters.py
├── pyproject.toml            # Package configuration
├── README.md                 # This file
├── LICENSE                   # MIT License
└── .gitignore                # Git ignore rules

Architecture

Data Flow

Remote YAML → DataService.load_conferences() → Conference models

                            DataService.process_rows() → ConferenceRow list

                            FilterSidebar (user filters) → FilterChanged event

                            CCFDeadlinesApp._update_conferences() → filtered rows

                            ConferenceTable.update_rows() → display

Key Components

ComponentPurpose
CCFDeadlinesAppMain orchestrator; reactive state management
DataServiceHTTP fetching, YAML parsing, row processing
ConferenceTableDataTable with real-time countdown refresh
FilterSidebarCheckbox-based multi-dimensional filtering
CountdownWidgetStandalone countdown display

Reactive State

The app uses Textual's reactive attributes for state synchronization:

selected_subs: set[str]          # Active category filters
selected_ranks: set[str]         # Active CCF rank filters
selected_core_ranks: set[str]    # Active CORE rank filters
selected_thcpl_ranks: set[str]   # Active THCPL rank filters
show_expired: bool               # Show/hide expired conferences
search_query: str                # Fuzzy search query
language: str                    # "en" or "zh"
conferences: list[ConferenceRow] # Current filtered rows

Development

Run Tests

pytest tests/ -v
pytest tests/ --cov=ccfddl_tui --cov-report=html

Type Checking

mypy ccfddl_tui/ tests/

Code Statistics

  • Total lines: ~2,176
  • Test files: 9
  • Source modules: 10
  • Widgets: 3
  • Data models: 5

Data Source

Conference data is fetched from the official CCF-Deadlines repository:

YAML Schema

- title: NeurIPS
  description: Conference on Neural Information Processing Systems
  sub: AI
  rank:
    ccf: A
    core: A*
    thcpl: A
  dblp: neurips
  confs:
    - year: 2025
      id: neurips25
      link: https://neurips.cc/
      timeline:
        - deadline: "2025-05-15 23:59:59"
          abstract_deadline: "2025-04-15 23:59:59"
          comment: Main paper deadline
      timezone: UTC-12
      date: December 8-14, 2025
      place: Vancouver, Canada

Favorites Persistence

Favorites are stored in ~/.ccfddl/favorites.json:

{
  "favorites": ["NeurIPS_2025", "CVPR_2025"]
}

License

MIT License — see LICENSE file.

Acknowledgments