diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000..61d73c7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,73 @@
+name: Bug report
+description: Report a reproducible bug or regression.
+title: "[Bug]: "
+labels:
+ - bug
+body:
+ - type: checkboxes
+ id: checks
+ attributes:
+ label: Pre-flight
+ options:
+ - label: I searched existing issues and did not find a duplicate.
+ required: true
+ - label: I can reproduce this on the latest version.
+ required: true
+
+ - type: textarea
+ id: summary
+ attributes:
+ label: What happened?
+ description: Describe the current behavior and what you expected.
+ placeholder: A clear, concise description of the bug.
+ validations:
+ required: true
+
+ - type: textarea
+ id: steps
+ attributes:
+ label: Steps to reproduce
+ placeholder: |
+ 1. Go to ...
+ 2. Click on ...
+ 3. Observe ...
+ validations:
+ required: true
+
+ - type: input
+ id: version
+ attributes:
+ label: App version
+ description: Version, tag, or commit SHA.
+ placeholder: 0.1.0
+ validations:
+ required: false
+
+ - type: dropdown
+ id: os
+ attributes:
+ label: OS
+ options:
+ - macOS
+ - Windows
+ - Linux
+ - Other
+ validations:
+ required: true
+
+ - type: textarea
+ id: logs
+ attributes:
+ label: Relevant logs
+ description: Paste any relevant output.
+ render: shell
+ validations:
+ required: false
+
+ - type: textarea
+ id: additional
+ attributes:
+ label: Additional context
+ description: Add screenshots, recordings, or extra context if helpful.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..3ba13e0
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1 @@
+blank_issues_enabled: false
diff --git a/.github/ISSUE_TEMPLATE/documentation_improvement.yml b/.github/ISSUE_TEMPLATE/documentation_improvement.yml
new file mode 100644
index 0000000..bd5c95f
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/documentation_improvement.yml
@@ -0,0 +1,59 @@
+name: Documentation improvement
+description: Report unclear, missing, or incorrect documentation.
+title: "[Docs]: "
+labels:
+ - documentation
+body:
+ - type: checkboxes
+ id: checks
+ attributes:
+ label: Pre-flight
+ options:
+ - label: I searched existing issues and did not find a duplicate.
+ required: true
+
+ - type: input
+ id: location
+ attributes:
+ label: Documentation location
+ description: Link to the file/page/section that needs improvement.
+ placeholder: docs/specs/feeds.md or URL
+ validations:
+ required: true
+
+ - type: textarea
+ id: issue
+ attributes:
+ label: What is unclear or incorrect?
+ description: Describe the specific problem.
+ validations:
+ required: true
+
+ - type: textarea
+ id: improvement
+ attributes:
+ label: Suggested improvement
+ description: What change would make this clearer or more accurate?
+ validations:
+ required: true
+
+ - type: dropdown
+ id: audience
+ attributes:
+ label: Who is affected most?
+ options:
+ - New contributors
+ - Existing contributors
+ - End users
+ - Maintainers
+ - Everyone
+ validations:
+ required: false
+
+ - type: textarea
+ id: additional
+ attributes:
+ label: Additional context
+ description: Include examples, snippets/screenshots, or related links.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 0000000..f27fc74
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,55 @@
+name: Feature request
+description: Suggest an improvement or a new capability.
+title: "[Feature]: "
+labels:
+ - enhancement
+body:
+ - type: checkboxes
+ id: checks
+ attributes:
+ label: Pre-flight
+ options:
+ - label: I searched existing issues and did not find a duplicate.
+ required: true
+
+ - type: textarea
+ id: problem
+ attributes:
+ label: Problem to solve
+ description: What user problem or workflow gap does this address?
+ placeholder: Describe the pain point.
+ validations:
+ required: true
+
+ - type: textarea
+ id: proposal
+ attributes:
+ label: Proposed solution
+ description: Describe the behavior you want.
+ placeholder: Describe the ideal outcome.
+ validations:
+ required: true
+
+ - type: textarea
+ id: alternatives
+ attributes:
+ label: Alternatives considered
+ description: Any workarounds or alternative approaches?
+ validations:
+ required: false
+
+ - type: textarea
+ id: scope
+ attributes:
+ label: Scope and impact
+ description: Note affected areas (UI, backend, search, settings, etc.).
+ validations:
+ required: false
+
+ - type: textarea
+ id: additional
+ attributes:
+ label: Additional context
+ description: Mockups, references, or examples are helpful.
+ validations:
+ required: false
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..d9b0d34
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,49 @@
+# Pull Request
+
+## Summary
+
+Describe what changed and why.
+
+## Related Issues
+
+Closes #
+
+## Type of Change
+
+- [ ] Fix
+- [ ] Feature
+- [ ] Refactor
+- [ ] Docs
+- [ ] Chore
+
+## Validation
+
+List what you ran and the result.
+
+```bash
+pnpm typecheck
+pnpm test
+pnpm lint
+pnpm format
+```
+
+If Rust code changed:
+
+```bash
+cd src-tauri
+cargo fmt --check
+cargo clippy --all-targets --all-features -- -D warnings
+
+# OR
+cargo clippy --fix --allow-dirty && cargo fmt
+```
+
+## Screenshots (If UI Changed)
+
+Attach screenshots or a short recording.
+
+## Checklist
+
+- [ ] I have read CONTRIBUTING.md
+- [ ] I kept this PR focused and reasonably small
+- [ ] I updated docs/tests where relevant
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 528ee7f..882ac0b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@
- Image (single or gallery) & video player with blob downloading
- Group notifications by reason & post, with clickable links to subjects and posts
+- Added dedicated post/thread view.
### 2026-04-06
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..6e8adce
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,78 @@
+# Contributing to Lazurite Desktop
+
+Thanks for helping improve Lazurite.
+
+## Setup
+
+1. Install prerequisites:
+ - Node.js 20+
+ - pnpm
+ - Rust stable toolchain (for Tauri/backend work)
+1. Install dependencies:
+
+```bash
+pnpm install
+```
+
+For Rust/Tauri development:
+
+```sh
+cd src-tauri
+cargo check && cargo build
+```
+
+1. Run the app:
+
+```bash
+# Frontend only
+pnpm dev
+
+# Full desktop app (Tauri + frontend)
+pnpm tauri dev
+```
+
+## Before Opening a Pull Request
+
+Run the following from the repository root:
+
+```bash
+pnpm typecheck
+pnpm test
+pnpm lint
+pnpm format
+```
+
+If your changes touch Rust code, also run:
+
+```bash
+cd src-tauri
+cargo fmt --check
+cargo clippy --all-targets --all-features -- -D warnings
+```
+
+## Project Conventions
+
+- Use pnpm for frontend workflows.
+- Keep Tauri commands in `src-tauri/src/commands.rs` and keep command handlers thin.
+- Put business logic in focused Rust modules, then call those from commands.
+- Follow Solid patterns used in this repo (for example, `Show`/`For`/`Index` where appropriate).
+- Follow the design system in `docs/design.md` for UI work.
+- Do not ignore lint rules.
+- Frontend errors should be human-readable; logs should be detailed and technical.
+
+## Pull Request Expectations
+
+- Keep changes focused and scoped.
+- Link related issues (for example, `Closes #123`).
+- Include screenshots or short recordings for visible UI changes.
+- Update docs/specs when behavior or architecture changes.
+- Add or update tests when practical.
+
+## Security
+
+Please do not open public issues for security vulnerabilities.
+Contact the [maintainers privately](mailto:info@stormlightlabs.org).
+
+## License
+
+By contributing, you agree that your contributions are licensed under the MIT License.
diff --git a/src/components/rail/AppRail.tsx b/src/components/rail/AppRail.tsx
index 6b2aab6..9087dd8 100644
--- a/src/components/rail/AppRail.tsx
+++ b/src/components/rail/AppRail.tsx
@@ -3,7 +3,7 @@ import { useAppShellUi } from "$/contexts/app-shell-ui";
import { openUrl } from "@tauri-apps/plugin-opener";
import { Show } from "solid-js";
import { AccountSwitcher } from "../account/AccountSwitcher";
-import { ArrowIcon } from "../shared/Icon";
+import { RailFoldIcon } from "../shared/Icon";
import { Wordmark } from "../Wordmark";
import { RailActionButton, RailButton } from "./AppRailButton";
@@ -19,8 +19,8 @@ function RailHeader(props: { collapsed: boolean; onToggleCollapse: () => void })
aria-label={props.collapsed ? "Expand app rail" : "Collapse app rail"}
aria-pressed={props.collapsed}
onClick={() => props.onToggleCollapse()}>
- }>
-
+ }>
+
diff --git a/src/components/search/SearchQueryInput.tsx b/src/components/search/SearchQueryInput.tsx
index e000ea5..8c898a3 100644
--- a/src/components/search/SearchQueryInput.tsx
+++ b/src/components/search/SearchQueryInput.tsx
@@ -91,9 +91,7 @@ function SearchInputField(
function LoadingIndicator(props: { loading: boolean }) {
return (
-
-
-
+
);
}
diff --git a/src/components/shared/Icon.tsx b/src/components/shared/Icon.tsx
index 73509b8..9b33bab 100644
--- a/src/components/shared/Icon.tsx
+++ b/src/components/shared/Icon.tsx
@@ -228,6 +228,22 @@ export function SettingsIcon(props: IconProps & { kind: SettingsIconKind }) {
);
}
+export function RailFoldIcon(props: JSX.HTMLAttributes & { class?: string; kind: "open" | "close" }) {
+ const [local, rest] = splitProps(props, ["class", "kind"]);
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
export function ArrowIcon(
props: JSX.HTMLAttributes & { class?: string; direction: "up" | "down" | "left" | "right" },
) {