Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions PRODUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Product

## Register

product

## Users

Linux desktop users who need their existing LINE conversations, groups, OpenChat rooms, media, and account features without running a web wrapper, Wine, or Android container. They use the app throughout the day and expect chat switching, media, notifications, and keyboard workflows to respond immediately. Thai and English are first-class interface languages.

## Product Purpose

Provide a native GTK4 and Libadwaita LINE client for Linux, backed by linejs. Success means the everyday LINE workflow is familiar, locally cached, reliable, and fast while remaining honest about unofficial protocol limitations.

## Brand Personality

Familiar, direct, dependable. The interface should feel like LINE adapted carefully to a Linux desktop, with concise copy and native platform behavior.

## Anti-references

- Web wrappers that feel slow or ignore desktop conventions.
- Decorative chat interfaces that compete with conversation content.
- Controls that look unlike either LINE or the surrounding Libadwaita system.
- Silent failures, fake loading states, and features that appear available but do not work.

## Design Principles

- Keep conversation content primary and controls immediately understandable.
- Preserve familiar LINE concepts while using standard GTK affordances.
- Show cached content immediately, then reconcile network updates in the background.
- Make unavailable or experimental behavior explicit and recoverable.
- Keep per-chat preferences private, local, and reversible.

## Accessibility & Inclusion

Target WCAG AA contrast where theme colors are under app control. Follow the system light or dark theme, support reduced motion through the existing animation preference, retain visible focus and keyboard paths, avoid color-only state, and keep Thai and English layouts readable at the supported font scales.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ Unofficial native LINE client for Linux. GTK4 / Libadwaita UI with a Deno protoc
| GTK4 + Libadwaita | `pacman -S gtk4 libadwaita` |
| Deno | Build-time protocol compiler; source-tree runs use `deno` or `DENO` |
| ffmpeg / ffprobe | voice record, video thumbs |
| wf-recorder + slurp | experimental Wayland screen sharing during calls |
| Optional | `pdftoppm`, `pdftotext` for PDF preview |

Wayland and X11 both work. Tested mainly on Arch-based desktops.
Expand Down
51 changes: 51 additions & 0 deletions assets/lang/eng.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"app_name": "LINE GTK",
"chats": "Chats",
"send": "Send",
"cancel": "Cancel",
"type_message": "Type a message…",
"settings": "Settings",
"features": "Features",
Expand Down Expand Up @@ -198,6 +199,8 @@
"media_open_video": "Open video",
"media_open_file": "Open file",
"media_open_externally": "Open externally",
"media_previous_image": "Previous image (Left arrow)",
"media_next_image": "Next image (Right arrow)",
"media_zoom_in": "Zoom in",
"media_zoom_out": "Zoom out",
"media_zoom_reset": "Reset zoom",
Expand All @@ -212,6 +215,20 @@
"media_unsupported_preview": "No in-app preview for this file. Download or open externally.",
"pick_voice": "Choose audio file",
"attach_file": "Attach photo, video, audio, or file",
"media_review_title": "Review attachments",
"media_review_hint": "Check, add, or remove items before sending",
"media_review_add": "Add files",
"media_review_remove": "Remove from this send",
"media_review_empty": "Add at least one photo or file to send.",
"media_review_count": "{n} items selected",
"media_review_send": "Send {n}",
"message_react": "React",
"message_reaction_failed": "Could not add reaction: {error}",
"message_unsend": "Unsend message",
"message_unsend_title": "Unsend this message?",
"message_unsend_body": "This removes the message for everyone in the chat. This cannot be undone.",
"message_unsent": "Message unsent",
"message_unsend_failed": "Could not unsend message: {error}",
"stickers": "Stickers",
"stickers_recent": "Recent",
"loading_stickers": "Loading stickers…",
Expand Down Expand Up @@ -281,6 +298,25 @@
"call_spk_vol": "Speaker volume",
"call_mic_vol_subtitle": "Outgoing call gain (0-2)",
"call_spk_vol_subtitle": "Incoming call gain (0-2)",
"call_connected_short": "Connected",
"call_share_screen": "Share screen",
"call_stop_sharing": "Stop sharing",
"call_share_unavailable": "Screen sharing was not negotiated for this call",
"call_share_selecting": "Select a window or screen to share…",
"call_share_starting": "Starting screen share…",
"call_share_active": "Sharing your screen",
"call_share_failed": "Screen share failed: {error}",
"profile_checking": "Checking friendship…",
"profile_friend": "LINE friend",
"profile_not_friend": "Add this person before starting a private chat",
"profile_add_friend": "Add friend",
"profile_private_chat": "Private chat",
"profile_add_success": "Friend added",
"profile_add_failed": "Could not add friend: {error}",
"profile_check_failed": "Could not check friendship: {error}",
"profile_blocked": "This profile is blocked and cannot be added here",
"profile_self": "This is your profile",
"profile_openchat_private_unavailable": "OpenChat profiles cannot be added or opened as private LINE chats",
"notification_sound": "Notification sound",
"notification_sound_subtitle": "Play the system notification sound with alerts",
"notification_sound_vol": "Notification volume",
Expand All @@ -293,6 +329,21 @@
"audio_output_subtitle": "PulseAudio / PipeWire sink",
"mute_chat": "Mute notifications",
"unmute_chat": "Unmute notifications",
"pin_chat": "Pin chat",
"unpin_chat": "Unpin chat",
"chat_album": "Album / chat media",
"chat_album_empty": "No downloaded photos or videos in the loaded messages yet",
"chat_background": "Chat background",
"chat_background_default": "Default",
"chat_background_mint": "Mint",
"chat_background_ocean": "Ocean",
"chat_background_dusk": "Dusk",
"chat_background_graphite": "Graphite",
"chat_background_choose_image": "Choose image",
"chat_background_images": "Background images",
"chat_background_saved": "Chat background saved",
"chat_background_failed": "Could not display this background",
"chat_background_save_failed": "Could not save background: {error}",
"chat_muted": "Chat muted (LINE server)",
"chat_unmuted": "Chat unmuted",
"mute_dm_only": "Mute is only for 1:1 friends",
Expand Down
51 changes: 51 additions & 0 deletions assets/lang/thai.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"app_name": "LINE GTK",
"chats": "แชท",
"send": "ส่ง",
"cancel": "ยกเลิก",
"type_message": "พิมพ์ข้อความ…",
"settings": "ตั้งค่า",
"features": "ฟีเจอร์",
Expand Down Expand Up @@ -198,6 +199,8 @@
"media_open_video": "เปิดวิดีโอ",
"media_open_file": "เปิดไฟล์",
"media_open_externally": "เปิดด้วยแอปอื่น",
"media_previous_image": "รูปก่อนหน้า (ลูกศรซ้าย)",
"media_next_image": "รูปถัดไป (ลูกศรขวา)",
"media_zoom_in": "ซูมเข้า",
"media_zoom_out": "ซูมออก",
"media_zoom_reset": "รีเซ็ตซูม",
Expand All @@ -212,6 +215,20 @@
"media_unsupported_preview": "ไม่มีพรีวิวในแอป ดาวน์โหลดหรือเปิดด้วยแอปอื่น",
"pick_voice": "เลือกไฟล์เสียง",
"attach_file": "แนบรูป วิดีโอ เสียง หรือไฟล์",
"media_review_title": "ตรวจสอบก่อนส่ง",
"media_review_hint": "ดู เพิ่ม หรือนำรายการออกก่อนกดส่ง",
"media_review_add": "เพิ่มไฟล์",
"media_review_remove": "นำออกจากชุดที่จะส่ง",
"media_review_empty": "เพิ่มรูปหรือไฟล์อย่างน้อยหนึ่งรายการ",
"media_review_count": "เลือกแล้ว {n} รายการ",
"media_review_send": "ส่ง {n} รายการ",
"message_react": "รีแอคชั่น",
"message_reaction_failed": "ใส่รีแอคชั่นไม่สำเร็จ: {error}",
"message_unsend": "ยกเลิกข้อความ",
"message_unsend_title": "ยกเลิกข้อความนี้ไหม",
"message_unsend_body": "ข้อความจะหายจากแชทของทุกคน และย้อนกลับไม่ได้",
"message_unsent": "ยกเลิกข้อความแล้ว",
"message_unsend_failed": "ยกเลิกข้อความไม่สำเร็จ: {error}",
"stickers": "สติกเกอร์",
"stickers_recent": "ล่าสุด",
"loading_stickers": "กำลังโหลดสติกเกอร์…",
Expand Down Expand Up @@ -281,6 +298,25 @@
"call_spk_vol": "ระดับลำโพง",
"call_mic_vol_subtitle": "ความดังไมค์ตอนโทร (0-2)",
"call_spk_vol_subtitle": "ความดังเสียงที่รับ (0-2)",
"call_connected_short": "เชื่อมต่อแล้ว",
"call_share_screen": "แชร์หน้าจอ",
"call_stop_sharing": "หยุดแชร์หน้าจอ",
"call_share_unavailable": "สายนี้ยังไม่ได้เจรจาช่องวิดีโอสำหรับแชร์หน้าจอ",
"call_share_selecting": "เลือกหน้าต่างหรือจอที่ต้องการแชร์…",
"call_share_starting": "กำลังเริ่มแชร์หน้าจอ…",
"call_share_active": "กำลังแชร์หน้าจอของคุณ",
"call_share_failed": "แชร์หน้าจอไม่สำเร็จ: {error}",
"profile_checking": "กำลังตรวจสอบสถานะเพื่อน…",
"profile_friend": "เป็นเพื่อนใน LINE แล้ว",
"profile_not_friend": "เพิ่มคนนี้เป็นเพื่อนก่อนเริ่มแชทส่วนตัว",
"profile_add_friend": "เพิ่มเพื่อน",
"profile_private_chat": "แชทส่วนตัว",
"profile_add_success": "เพิ่มเพื่อนแล้ว",
"profile_add_failed": "เพิ่มเพื่อนไม่สำเร็จ: {error}",
"profile_check_failed": "ตรวจสอบสถานะเพื่อนไม่สำเร็จ: {error}",
"profile_blocked": "โปรไฟล์นี้ถูกบล็อก จึงเพิ่มเพื่อนจากหน้านี้ไม่ได้",
"profile_self": "นี่คือโปรไฟล์ของคุณ",
"profile_openchat_private_unavailable": "โปรไฟล์ OpenChat ไม่สามารถเพิ่มเพื่อนหรือเปิดเป็นแชท LINE ส่วนตัวได้",
"notification_sound": "เสียงแจ้งเตือน",
"notification_sound_subtitle": "เล่นเสียงแจ้งเตือนของระบบเมื่อมีข้อความ",
"notification_sound_vol": "ระดับเสียงแจ้งเตือน",
Expand All @@ -293,6 +329,21 @@
"audio_output_subtitle": "sink ของ PulseAudio / PipeWire",
"mute_chat": "ปิดแจ้งเตือนแชท",
"unmute_chat": "เปิดแจ้งเตือนแชท",
"pin_chat": "ปักหมุดแชท",
"unpin_chat": "เลิกปักหมุดแชท",
"chat_album": "อัลบั้ม / สื่อในแชท",
"chat_album_empty": "ยังไม่มีรูปหรือวิดีโอที่โหลดแล้วในข้อความชุดนี้",
"chat_background": "พื้นหลังแชท",
"chat_background_default": "ค่าเริ่มต้น",
"chat_background_mint": "มินต์",
"chat_background_ocean": "มหาสมุทร",
"chat_background_dusk": "ยามเย็น",
"chat_background_graphite": "กราไฟต์",
"chat_background_choose_image": "เลือกรูปภาพ",
"chat_background_images": "รูปพื้นหลัง",
"chat_background_saved": "บันทึกพื้นหลังแชทแล้ว",
"chat_background_failed": "แสดงพื้นหลังนี้ไม่ได้",
"chat_background_save_failed": "บันทึกพื้นหลังไม่ได้: {error}",
"chat_muted": "ปิดแจ้งเตือนแล้ว (ฝั่งเซิร์ฟเวอร์ LINE)",
"chat_unmuted": "เปิดแจ้งเตือนแล้ว",
"mute_dm_only": "ปิดเสียงได้เฉพาะเพื่อน 1:1",
Expand Down
4 changes: 2 additions & 2 deletions protocol/deno.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"tasks": {
"sidecar": "deno run --no-prompt --allow-read --allow-write --allow-net --allow-run=ffmpeg,ffprobe --allow-sys --allow-env src/main.ts",
"dev": "deno run --no-prompt --watch --allow-read --allow-write --allow-net --allow-run=ffmpeg,ffprobe --allow-sys --allow-env src/main.ts",
"sidecar": "deno run --no-prompt --allow-read --allow-write --allow-net --allow-run=ffmpeg,ffprobe,slurp,wf-recorder --allow-sys --allow-env src/main.ts",
"dev": "deno run --no-prompt --watch --allow-read --allow-write --allow-net --allow-run=ffmpeg,ffprobe,slurp,wf-recorder --allow-sys --allow-env src/main.ts",
"check": "deno fmt --check && deno lint && deno check src/main.ts && deno test --allow-read --allow-write tests/"
},
"lint": {
Expand Down
Loading
Loading