Skip to content

Commit 1ecaacc

Browse files
committed
refactor: rename project from readdev to devsync, update UI branding, and add README demo.
1 parent a340a1f commit 1ecaacc

6 files changed

Lines changed: 47 additions & 42 deletions

File tree

‎.github/workflows/release.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
run: cargo build --release --target ${{ matrix.target }}
3232

3333
- name: Rename binary
34-
run: cp target/${{ matrix.target }}/release/readdev ${{ matrix.artifact }}
34+
run: cp target/${{ matrix.target }}/release/devsync ${{ matrix.artifact }}
3535

3636
- name: Upload artifact
3737
uses: actions/upload-artifact@v4

‎Cargo.lock‎

Lines changed: 20 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[package]
2-
name = "readdev"
2+
name = "devsync"
33
version = "0.1.0"
44
edition = "2024"
55
description = "A high-performance CLI tool for syncing and reading dev articles"

‎README.md‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020

2121
DevSync is a high-performance terminal UI for discovering and reading developer articles. It aggregates 46+ RSS feeds from top engineering blogs, news sites, and research outlets — with AI-powered summarization, bookmarks, smart sorting, and a polished TUI built in Rust.
2222

23+
## Demo
24+
25+
[![asciicast](https://asciinema.org/a/IVjLG4XZXoIDb38r.svg)](https://asciinema.org/a/IVjLG4XZXoIDb38r)
26+
2327
## Features
2428

2529
- **46+ built-in RSS feed sources** — Dev.to, Hacker News, Lobsters, Hashnode, Netflix Tech, Cloudflare, and many more
@@ -52,7 +56,7 @@ Requires [Rust](https://rustup.rs/) 1.85+.
5256
git clone https://github.com/zeyadetman/devSync.git
5357
cd devSync
5458
cargo build --release
55-
cp target/release/readdev /usr/local/bin/devsync
59+
cp target/release/devsync /usr/local/bin/devsync
5660
```
5761

5862
## Usage

‎src/cache.rs‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ use std::path::PathBuf;
66

77
use crate::models::{Article, BookmarkStore, CachedFeed, ReadListStore};
88

9-
const CACHE_FILE: &str = "readdev_cache.json";
10-
const BOOKMARKS_FILE: &str = "readdev_bookmarks.json";
11-
const READ_LIST_FILE: &str = "readdev_readlist.json";
12-
const SEEN_FILE: &str = "readdev_seen.json";
9+
const CACHE_FILE: &str = "devsync_cache.json";
10+
const BOOKMARKS_FILE: &str = "devsync_bookmarks.json";
11+
const READ_LIST_FILE: &str = "devsync_readlist.json";
12+
const SEEN_FILE: &str = "devsync_seen.json";
1313
const CACHE_TTL_SECS: i64 = 600; // 10 minutes
1414

1515
fn data_dir() -> PathBuf {
1616
dirs::data_dir()
1717
.unwrap_or_else(|| PathBuf::from("/tmp"))
18-
.join("readdev")
18+
.join("devsync")
1919
}
2020

2121
fn cache_path() -> PathBuf {
@@ -140,7 +140,7 @@ pub fn save_seen(seen: &HashSet<String>) {
140140
}
141141
}
142142

143-
const USER_SOURCES_FILE: &str = "readdev_user_sources.json";
143+
const USER_SOURCES_FILE: &str = "devsync_user_sources.json";
144144

145145
fn user_sources_path() -> PathBuf {
146146
data_dir().join(USER_SOURCES_FILE)
@@ -166,7 +166,7 @@ pub fn save_user_sources(sources: &[crate::models::UserSource]) -> Result<()> {
166166
fs::write(&path, data).context("Failed to write user sources file")?;
167167
Ok(())
168168
}
169-
const GEMINI_KEY_FILE: &str = "readdev_gemini_key.txt";
169+
const GEMINI_KEY_FILE: &str = "devsync_gemini_key.txt";
170170

171171
fn gemini_key_path() -> PathBuf {
172172
data_dir().join(GEMINI_KEY_FILE)

‎src/ui.rs‎

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ const TAG_INACTIVE: Color = Color::Rgb(70, 70, 90);
2121
const DATE_COLOR: Color = Color::Rgb(150, 150, 180);
2222

2323
const ASCII_ART: &str = r#"
24-
____ ______
25-
/ __ \___ ____ _____/ / __ \___ _ __
26-
/ /_/ / _ \/ __ `/ __ / / / / / _ \ | / /
27-
/ _, _/ __/ /_/ / /_/ / /_/ / __/ |/ /
28-
/_/ |_|\___/\__,_/\__,_/_____/\___/|___/
24+
____ _____
25+
/ __ \___ _ _____ / ___/__ ______ _____
26+
/ / / / _ \ | / / __ \__ \/ / / / __ \/ ___/
27+
/ /_/ / __/ |/ /___/ /__/ / /_/ / / / / /__
28+
/_____/\___/|___//____/____/\__, /_/ /_/\___/
29+
/____/
2930
"#;
3031

3132
pub fn render(frame: &mut Frame, app: &mut App) {
@@ -223,7 +224,7 @@ fn render_help(frame: &mut Frame, area: Rect) {
223224
])
224225
.split(area);
225226

226-
let title = Paragraph::new(" 📚 readdev Command Palette ")
227+
let title = Paragraph::new(" 📚 DevSync Command Palette ")
227228
.style(Style::default().fg(ACCENT).add_modifier(Modifier::BOLD))
228229
.alignment(Alignment::Center)
229230
.block(Block::default().borders(Borders::BOTTOM).border_style(Style::default().fg(INDIGO)));
@@ -395,7 +396,7 @@ fn render_home(frame: &mut Frame, app: &App, area: Rect) {
395396
Line::from(""),
396397
Line::from(vec![
397398
Span::styled(" [Q] ", Style::default().fg(CYAN).add_modifier(Modifier::BOLD)),
398-
Span::styled("Exit readdev ", Style::default().fg(WHITE)),
399+
Span::styled("Exit DevSync ", Style::default().fg(WHITE)),
399400
]),
400401
];
401402

@@ -466,7 +467,7 @@ fn render_home(frame: &mut Frame, app: &App, area: Rect) {
466467
let status_text = if app.loading == LoadingState::Loading {
467468
" ⟳ Synchronizing feeds... "
468469
} else {
469-
" readdev v0.1.0 • Ready "
470+
" DevSync v0.1.0 • Ready "
470471
};
471472
let status = Paragraph::new(status_text)
472473
.style(Style::default().fg(DIM_TEXT).bg(Color::Rgb(25, 25, 35)))
@@ -537,20 +538,20 @@ fn render_articles(frame: &mut Frame, app: &mut App, area: Rect) {
537538
// Header bar
538539
let article_count = app.visible_articles().len();
539540
let header_title = if let Some(src) = &app.source_filter {
540-
format!(" readdev — {} articles from {} ", article_count, src)
541+
format!(" DevSync — {} articles from {} ", article_count, src)
541542
} else if !app.search_query.is_empty() {
542543
format!(
543-
" readdev — {} results for \"{}\" ",
544+
" DevSync — {} results for \"{}\" ",
544545
article_count, app.search_query
545546
)
546547
} else if app.active_tag != Tag::All {
547548
format!(
548-
" readdev — {} {} articles ",
549+
" DevSync — {} {} articles ",
549550
article_count,
550551
app.active_tag.label()
551552
)
552553
} else {
553-
format!(" readdev — {} articles ", article_count)
554+
format!(" DevSync — {} articles ", article_count)
554555
};
555556
let header = Paragraph::new(header_title)
556557
.style(

0 commit comments

Comments
 (0)