Skip to content

Commit eebaf3d

Browse files
committed
Release v1.0.0
1 parent ea39444 commit eebaf3d

86 files changed

Lines changed: 3855 additions & 1216 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎README.md‎

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# VibeShell
22

33
> AI-native remote workspace for SSH and SFTP.
4-
> **Status:** Beta `v0.2.0`
4+
> **Status:** `v1.0.0`
55
66
VibeShell is a desktop app built with `Tauri 2 + Rust + React` for people who live in terminals but want stronger context, safer remote workflows, and an AI assistant that feels native instead of bolted on.
77

@@ -17,17 +17,19 @@ It combines:
1717
- workspace persistence
1818
- a focused dark UI designed for day-to-day remote operations
1919

20-
## What `v0.2` includes
20+
## What `v1.0.0` includes
21+
22+
`v1.0.0` includes:
2123

2224
- Native desktop shell powered by `Tauri`
2325
- Multi-session terminal workspace with split panes
24-
- SSH sessions with resize and streaming I/O
25-
- SFTP drawer for remote file browsing and editing
26-
- AI side panel with Markdown rendering, resizable width, and local Ollama integration
26+
- SSH sessions with resize, clipboard shortcuts, and streaming I/O
27+
- SFTP workspace for remote browsing, path jumping, upload/download, editing, rename, delete, and search
28+
- AI side panel with Markdown rendering, code copy, resizable width, Ollama model detection, and context-aware assistant tools
2729
- Sidebar with collapsible navigation, Zen mode, GitHub link, and app preferences
2830
- Theme, language, and terminal font preferences with persistence
2931
- Secure credential storage and SSH host trust workflow
30-
- Workspace/session persistence and server grouping
32+
- Workspace/session persistence, remote file restore, and server grouping
3133

3234
## Product direction
3335

@@ -37,7 +39,14 @@ VibeShell is currently optimized around:
3739
- `SFTP` for remote files
3840
- `Ollama` as the best local AI path
3941

40-
`FTP` support still exists in backend code paths, but it is no longer part of the main UI flow in `v0.2`. The current product direction is to keep the core experience opinionated and reliable around `22`-port remote workflows.
42+
`FTP` support still exists in backend code paths, but it is no longer part of the main UI flow in `v1.0.0`. The current product direction is to keep the core experience opinionated and reliable around `22`-port remote workflows.
43+
44+
`v1.0.0` is intentionally opinionated:
45+
46+
- `SSH` is the shell entry point
47+
- `SFTP` is the file entry point
48+
- both share the same target and credentials
49+
- `AI` is treated as a native assistant layer, not a separate chatbot product
4150

4251
## Tech stack
4352

@@ -104,6 +113,7 @@ VibeShell is designed to work well with local Ollama:
104113
- the app can probe local models
105114
- it can attempt to start Ollama when needed
106115
- model selection uses the locally available model list
116+
- the assistant can follow UI language and render rich Markdown replies
107117

108118
If Ollama is not already running, you can still start it manually:
109119

@@ -127,13 +137,20 @@ This is mostly useful during development and debugging. For the current product
127137

128138
## Current maturity
129139

130-
`v0.2` is no longer a throwaway prototype. The app is usable, the build is healthy, and the core architecture is in place.
140+
`v1.0.0` is no longer a throwaway prototype. The app is usable, the build is healthy, and the core architecture is in place.
141+
142+
Current strengths:
143+
144+
- SSH is stable enough for real terminal work
145+
- SFTP is a first-class workflow, not an afterthought
146+
- AI is integrated into the workspace and understands terminal/files/workspace context
147+
- build and test health are strong enough for public release
131148

132-
That said, it is still in active refinement:
149+
Areas that will continue improving after `v1.0.0`:
133150

134-
- SSH/SFTP real-world stability should keep improving
135-
- the AI workflow and context handling will continue to get stronger
136-
- visual polish is still being iterated
151+
- longer-run real-world SSH/SFTP validation
152+
- deeper AI context awareness and action flows
153+
- ongoing visual polish and workflow refinement
137154

138155
## GitHub
139156

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "vibeshell",
33
"private": true,
4-
"version": "0.2.0",
4+
"version": "1.0.0",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",

‎scripts/generate_app_icon.py‎

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -58,62 +58,66 @@ def make_icon(size: int = BASE_SIZE) -> Image.Image:
5858
canvas = Image.new("RGBA", (size, size), (0, 0, 0, 0))
5959
radius = int(size * 0.235)
6060

61-
background = vertical_gradient(size, (3, 7, 18), (17, 24, 39))
62-
aurora = radial_glow(size, (size * 0.24, size * 0.18), size * 0.52, (49, 214, 255), 0.30)
63-
depth = radial_glow(size, (size * 0.82, size * 0.86), size * 1.02, (2, 4, 12), 0.96)
64-
rim = radial_glow(size, (size * 0.70, size * 0.74), size * 0.34, (88, 95, 255), 0.18)
61+
background = vertical_gradient(size, (3, 7, 18), (5, 10, 18))
62+
aurora = radial_glow(size, (size * 0.18, size * 0.16), size * 0.30, (34, 211, 238), 0.11)
63+
depth = radial_glow(size, (size * 0.78, size * 0.80), size * 0.78, (2, 5, 12), 0.35)
6564
panel = Image.alpha_composite(background, depth)
6665
panel = Image.alpha_composite(panel, aurora)
67-
panel = Image.alpha_composite(panel, rim)
68-
69-
vignette = Image.new("RGBA", (size, size), (0, 0, 0, 0))
70-
vignette_draw = ImageDraw.Draw(vignette)
71-
inset = int(size * 0.03)
72-
vignette_draw.rounded_rectangle(
73-
(inset, inset, size - inset, size - inset),
74-
radius=radius - inset,
75-
outline=(255, 255, 255, 26),
76-
width=max(4, size // 128),
66+
67+
shell = Image.new("RGBA", (size, size), (0, 0, 0, 0))
68+
shell_draw = ImageDraw.Draw(shell)
69+
shell_draw.rounded_rectangle(
70+
(1, 1, size - 2, size - 2),
71+
radius=radius,
72+
outline=(255, 255, 255, 16),
73+
width=max(3, size // 170),
74+
)
75+
inner_inset = int(size * 0.055)
76+
shell_draw.rounded_rectangle(
77+
(inner_inset, inner_inset, size - inner_inset, size - inner_inset),
78+
radius=radius - inner_inset,
79+
outline=(255, 255, 255, 10),
80+
width=max(2, size // 220),
7781
)
78-
panel = Image.alpha_composite(panel, vignette)
82+
panel = Image.alpha_composite(panel, shell)
7983

8084
mask = rounded_mask(size, radius)
8185
canvas.paste(panel, (0, 0), mask)
8286

8387
draw = ImageDraw.Draw(canvas)
84-
stroke = max(18, size // 34)
88+
stroke = max(16, size // 36)
8589
chevron = [
86-
(size * 0.31, size * 0.34),
87-
(size * 0.43, size * 0.50),
88-
(size * 0.31, size * 0.66),
90+
(size * 0.31, size * 0.36),
91+
(size * 0.46, size * 0.50),
92+
(size * 0.31, size * 0.64),
8993
]
9094
draw.line(chevron, fill=(235, 251, 255, 248), width=stroke, joint="curve")
9195

92-
underline_width = max(18, size // 42)
96+
underline_width = max(16, size // 44)
9397
draw.line(
94-
(size * 0.55, size * 0.66, size * 0.74, size * 0.66),
95-
fill=(235, 251, 255, 236),
98+
(size * 0.53, size * 0.66, size * 0.76, size * 0.66),
99+
fill=(233, 250, 255, 228),
96100
width=underline_width,
97101
)
98102

99-
dot_radius = size * 0.05
103+
dot_radius = size * 0.03
100104
dot_bbox = (
101-
size * 0.60 - dot_radius,
102-
size * 0.34 - dot_radius,
103-
size * 0.60 + dot_radius,
104-
size * 0.34 + dot_radius,
105+
size * 0.69 - dot_radius,
106+
size * 0.375 - dot_radius,
107+
size * 0.69 + dot_radius,
108+
size * 0.375 + dot_radius,
105109
)
106-
draw.ellipse(dot_bbox, fill=(103, 232, 249, 238))
110+
draw.ellipse(dot_bbox, fill=(45, 212, 191, 236))
107111

108-
accent_width = max(10, size // 90)
112+
accent_width = max(7, size // 120)
109113
draw.line(
110-
(size * 0.55, size * 0.27, size * 0.72, size * 0.27),
111-
fill=(103, 232, 249, 125),
114+
(size * 0.53, size * 0.315, size * 0.62, size * 0.315),
115+
fill=(103, 232, 249, 48),
112116
width=accent_width,
113117
)
114118

115-
glow = canvas.filter(ImageFilter.GaussianBlur(radius=size * 0.022))
116-
glow = ImageChops.multiply(glow, Image.new("RGBA", (size, size), (56, 189, 248, 120)))
119+
glow = canvas.filter(ImageFilter.GaussianBlur(radius=size * 0.008))
120+
glow = ImageChops.multiply(glow, Image.new("RGBA", (size, size), (34, 211, 238, 38)))
117121
canvas = Image.alpha_composite(glow, canvas)
118122

119123
return canvas
@@ -169,6 +173,12 @@ def main() -> None:
169173
sizes=[(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)],
170174
)
171175

176+
image.save(
177+
ICONS_DIR / "icon.icns",
178+
format="ICNS",
179+
sizes=[(16, 16), (32, 32), (64, 64), (128, 128), (256, 256), (512, 512), (1024, 1024)],
180+
)
181+
172182
build_iconset(image)
173183

174184

‎src-tauri/Cargo.lock‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎src-tauri/Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "vibeshell"
3-
version = "0.2.0"
3+
version = "1.0.0"
44
description = "A modern, AI-first SSH/SFTP terminal"
55
authors = ["VibeShell Team"]
66
edition = "2021"

‎src-tauri/capabilities/default.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"core:default",
88
"core:event:default",
99
"core:event:allow-emit",
10-
"core:event:allow-listen"
10+
"core:event:allow-listen",
11+
"shell:default"
1112
]
1213
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"default":{"identifier":"default","description":"Default desktop capability for VibeShell.","local":true,"windows":["main"],"permissions":["core:default","core:event:default","core:event:allow-emit","core:event:allow-listen"]}}
1+
{"default":{"identifier":"default","description":"Default desktop capability for VibeShell.","local":true,"windows":["main"],"permissions":["core:default","core:event:default","core:event:allow-emit","core:event:allow-listen","shell:default"]}}

‎src-tauri/icons/128x128.png‎

-9.35 KB
Loading

‎src-tauri/icons/128x128@2x.png‎

-29.1 KB
Loading

‎src-tauri/icons/32x32.png‎

-825 Bytes
Loading

0 commit comments

Comments
 (0)