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


- 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 Navigation —
j/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
- Python 3.10 or higher
- pip package manager
git clone https://github.com/ccfddl/ccfddl-tui.git
cd ccfddl-tui
pip install -e .
pip install -e ".[dev]"
| Package | Purpose |
|---|
textual>=0.47.0 | Terminal UI framework |
pyyaml>=6.0 | YAML configuration parsing |
requests>=2.28.0 | HTTP requests for remote data |
python-dateutil>=2.8.0 | Flexible datetime parsing |
rich>=13.0.0 | Rich text formatting |
ccfddl-tui
ccfddl-tui --url https://example.com/conferences.yml
| Key | Action |
|---|
j / ↓ | Move down one row |
k / ↑ | Move up one row |
g | Go to first row |
G | Go to last row |
| Key | Action |
|---|
Enter | Open selected conference URL in browser |
f | Toggle favorite (★) for selected conference |
l | Toggle language (English ↔ Chinese) |
r | Refresh data from source |
q | Quit application |
? | Show help screen |
| Action | Method |
|---|
| Filter by category | Click checkboxes in sidebar |
| Filter by rank | Click CCF/CORE/THCPL checkboxes |
| Search by title | Type in search box |
| Show expired | Toggle "Show Expired" checkbox |
| Clear search | Press Esc |
| Color | Meaning |
|---|
| 🔴 Red | Less than 1 day remaining |
| 🟡 Yellow | Less than 7 days remaining |
| 🔵 Blue | Less than 30 days remaining |
| 🟢 Green | 30+ days remaining |
| Rank | Color |
|---|
| A / A* | Red (bold for A*) |
| B | Yellow |
| C | Green |
| N | Dim |
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
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
| Component | Purpose |
|---|
CCFDeadlinesApp | Main orchestrator; reactive state management |
DataService | HTTP fetching, YAML parsing, row processing |
ConferenceTable | DataTable with real-time countdown refresh |
FilterSidebar | Checkbox-based multi-dimensional filtering |
CountdownWidget | Standalone countdown display |
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
pytest tests/ -v
pytest tests/ --cov=ccfddl_tui --cov-report=html
mypy ccfddl_tui/ tests/
- Total lines: ~2,176
- Test files: 9
- Source modules: 10
- Widgets: 3
- Data models: 5
Conference data is fetched from the official CCF-Deadlines repository:
- 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 are stored in ~/.ccfddl/favorites.json:
{
"favorites": ["NeurIPS_2025", "CVPR_2025"]
}
MIT License — see LICENSE file.