Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
ed497bc
Merge pull request #128 from fboucher/main
fboucher Apr 3, 2026
831e0dc
feat: hire Star Wars squad team for v-next app backlog
fboucher Apr 3, 2026
a779550
feat: extract NoteBookmark.SharedUI Razor Class Library (#119)
fboucher Apr 3, 2026
7b94858
docs: Update squad records post-Leia #119 completion
fboucher Apr 3, 2026
792b6dd
test: fix and complete bUnit regression tests for SharedUI extraction…
fboucher Apr 3, 2026
4fe5057
docs: biggs learnings from bUnit #119 regression tests
fboucher Apr 3, 2026
b3ab916
docs: merge biggs test strategy decision into decisions.md
fboucher Apr 3, 2026
f2ccf22
refactor: NoteDialog uses EventCallback<NoteDialogResult> instead of …
fboucher Apr 3, 2026
c47bce1
docs: update Leia history and add NoteDialog EventCallback decision r…
fboucher Apr 3, 2026
1480aa4
Merge pull request #129 from fboucher/squad/119-extract-sharedui
fboucher Apr 4, 2026
b9337d2
test: proactive delta API integration tests (#121)
fboucher Apr 4, 2026
7103595
docs: update Biggs history with #121 delta API test learnings
fboucher Apr 4, 2026
13e5285
feat: DateModified + delta API endpoints (#121)
fboucher Apr 4, 2026
b400843
Merge pull request #130 from fboucher/squad/121-date-modified-delta-api
fboucher Apr 4, 2026
4199c7b
feat: MAUI scaffold + Keycloak auth (#120)
fboucher Apr 4, 2026
bf106a5
docs: add MAUI Android development environment setup guide
fboucher Apr 11, 2026
61ade30
Merge remote-tracking branch 'origin/v-next' into v-next
fboucher Apr 11, 2026
2e4c0f5
feat: add optional development configuration and update appsettings f…
fboucher May 1, 2026
e95cac3
feat: Add grill-with-docs skill and stabilize MAUI Android auth
fboucher May 18, 2026
6ebc4e8
fix login and auth for blazor app
fboucher May 18, 2026
83344c2
add missing parts for tests
fboucher May 18, 2026
6298f72
Merge commit '83344c2984ba584933fd2339297d60140648960e' into squad/12…
fboucher May 18, 2026
cf08647
Merge pull request #131 from fboucher/squad/120-maui-scaffold-keycloak
fboucher May 18, 2026
c6d269f
feat: Update version to 1.1.4 and enhance footer links in MainLayout
fboucher May 18, 2026
07b8786
clean-up release
fboucher May 18, 2026
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
3 changes: 3 additions & 0 deletions .github/workflows/running-unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ jobs:
${{ env.DEFAULT_DOTNET_VERSION }}
10.0.x
- name: Restore workloads
run: dotnet workload restore

- name: Restore dependencies
run: dotnet restore

Expand Down
23 changes: 13 additions & 10 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
# dotenv files
.env

# Local MAUI mobile configuration overrides
src/NoteBookmark.MauiApp/wwwroot/appsettings.Development.json

# User-specific files
*.rsuser
*.suo
Expand Down Expand Up @@ -510,15 +513,15 @@ todos/
.copilot/

# Squad/Agent files
.github/agents/
# Squad (local AI team - not committed)
.ai-team/
.github/agents/
# Squad (local AI team - not committed)
.ai-team/

src/NoteBookmark.BlazorApp/Data/
# Squad: ignore runtime state (logs, inbox, sessions)
.squad/orchestration-log/
.squad/log/
.squad/decisions/inbox/
.squad/sessions/
# Squad: SubSquad activation file (local to this machine)
.squad-workstream
# Squad: ignore runtime state (logs, inbox, sessions)
.squad/orchestration-log/
.squad/log/
.squad/decisions/inbox/
.squad/sessions/
# Squad: SubSquad activation file (local to this machine)
.squad-workstream
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>1.1.2</Version>
<Version>1.1.4</Version>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
Expand Down
6 changes: 6 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
<!-- MAUI packages -->
<PackageVersion Include="Microsoft.Maui.Controls" Version="10.0.20" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebView.Maui" Version="10.0.20" />
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.1" />
<!-- Other packages -->
<PackageVersion Include="HtmlAgilityPack" Version="1.12.4" />
<PackageVersion Include="Markdig" Version="0.44.0" />
Expand All @@ -39,6 +44,7 @@
<PackageVersion Include="System.Text.Json" Version="9.0.10" />
<PackageVersion Include="Reka.SDK" Version="0.1.0" />
<!-- Test packages -->
<PackageVersion Include="bunit" Version="2.7.2" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="FluentAssertions" Version="8.8.0" />
<PackageVersion Include="Moq" Version="4.20.72" />
Expand Down
45 changes: 45 additions & 0 deletions NoteBookmark.sln
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NoteBookmark.AIServices.Tests", "src\NoteBookmark.AIServices.Tests\NoteBookmark.AIServices.Tests.csproj", "{13B6E1BC-4B32-4082-A080-FE443F598967}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NoteBookmark.BlazorApp.Tests", "src\NoteBookmark.BlazorApp.Tests\NoteBookmark.BlazorApp.Tests.csproj", "{C04232AF-A144-47C9-B4D4-3259C61E5ABC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NoteBookmark.SharedUI", "src\NoteBookmark.SharedUI\NoteBookmark.SharedUI.csproj", "{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NoteBookmark.MauiApp", "src\NoteBookmark.MauiApp\NoteBookmark.MauiApp.csproj", "{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -127,12 +133,51 @@ Global
{13B6E1BC-4B32-4082-A080-FE443F598967}.Release|x64.Build.0 = Release|Any CPU
{13B6E1BC-4B32-4082-A080-FE443F598967}.Release|x86.ActiveCfg = Release|Any CPU
{13B6E1BC-4B32-4082-A080-FE443F598967}.Release|x86.Build.0 = Release|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Debug|x64.ActiveCfg = Debug|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Debug|x64.Build.0 = Debug|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Debug|x86.ActiveCfg = Debug|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Debug|x86.Build.0 = Debug|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Release|Any CPU.Build.0 = Release|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Release|x64.ActiveCfg = Release|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Release|x64.Build.0 = Release|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Release|x86.ActiveCfg = Release|Any CPU
{C04232AF-A144-47C9-B4D4-3259C61E5ABC}.Release|x86.Build.0 = Release|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Debug|x64.ActiveCfg = Debug|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Debug|x64.Build.0 = Debug|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Debug|x86.ActiveCfg = Debug|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Debug|x86.Build.0 = Debug|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Release|Any CPU.Build.0 = Release|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Release|x64.ActiveCfg = Release|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Release|x64.Build.0 = Release|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Release|x86.ActiveCfg = Release|Any CPU
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA}.Release|x86.Build.0 = Release|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Debug|x64.ActiveCfg = Debug|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Debug|x64.Build.0 = Debug|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Debug|x86.ActiveCfg = Debug|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Debug|x86.Build.0 = Debug|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Release|Any CPU.Build.0 = Release|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Release|x64.ActiveCfg = Release|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Release|x64.Build.0 = Release|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Release|x86.ActiveCfg = Release|Any CPU
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{13B6E1BC-4B32-4082-A080-FE443F598967} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{C04232AF-A144-47C9-B4D4-3259C61E5ABC} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{1AD790B0-8C91-468A-B21E-C2C5A4F7E1CA} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{9FFD0186-2C97-40F7-9CA1-EDEC3C2A0EF3} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D59FFF09-97C3-47EF-B64D-B014BFA22C80}
Expand Down
178 changes: 178 additions & 0 deletions docs/maui-android-dev-setup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
# MAUI Android Development Environment Setup

This guide covers setting up a local development environment for the NoteBookmark MAUI Android app.

**Platform:** Debian 13

## Step 1 — Install JDK 21

```bash
sudo apt install openjdk-21-jdk
```

Add `JAVA_HOME` to your shell config (`~/.zshrc` or `~/.bashrc`):

```bash
echo 'export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64' >> ~/.zshrc
source ~/.zshrc
```

Verify:

```bash
java -version
```

## Step 2 — Install .NET MAUI Android workload

.NET 9 or 10 must already be installed. Then:

```bash
dotnet workload install maui-android
```

This downloads ~2 GB and takes a few minutes.

Verify:

```bash
dotnet workload list
```

You should see `maui-android` in the output.


## Step 3 — Install Android command-line tools

1. Download the **Command line tools only** package from:
https://developer.android.com/studio#command-tools
*(look for "Command line tools only" at the bottom of the page)*

2. Extract and place them in the expected location:

```bash
mkdir -p ~/Android/Sdk/cmdline-tools
unzip ~/Downloads/commandlinetools-linux-*_latest.zip -d ~/Android/Sdk/cmdline-tools
mv ~/Android/Sdk/cmdline-tools/cmdline-tools ~/Android/Sdk/cmdline-tools/latest
```

3. Add `ANDROID_HOME` to your shell config:

```bash
cat >> ~/.zshrc << 'EOF'

# Android SDK
export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH
EOF
source ~/.zshrc
```

Verify:

```bash
sdkmanager --version
```


## Step 4 — Install SDK packages

Accept all licenses first:

```bash
sdkmanager --licenses
```

Then install the required packages (downloads ~2–3 GB):

```bash
sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0" "emulator" "system-images;android-35;google_apis;x86_64"
```

Verify everything installed:

```bash
sdkmanager --list_installed
```

You should see `platform-tools`, `platforms;android-35`, `build-tools;35.0.0`, `emulator`, and `system-images;android-35;google_apis;x86_64`.


## Step 5 — Create an Android Virtual Device (AVD)

```bash
avdmanager create avd -n maui_dev -k "system-images;android-35;google_apis;x86_64"
```

When prompted *"Do you wish to create a custom hardware profile?"*, answer `no`.

Verify the AVD was created:

```bash
avdmanager list avd
```


## Step 6 — Install VS Code extensions

You need the official .NET MAUI extension on top of the standard C# tooling.

Required extensions:

| Extension | Purpose |
|---|---|
| `ms-dotnettools.csharp` | C# language support |
| `ms-dotnettools.csdevkit` | Solution explorer, test runner |
| `ms-dotnettools.dotnet-maui` | MAUI project support, Android deploy/debug |

Install the MAUI extension from the terminal:

```bash
code --install-extension ms-dotnettools.dotnet-maui
```

Or search **".NET MAUI"** in the VS Code Extensions panel.

The MAUI extension adds device selection (emulator or physical device), one-click launch/debug, and MAUI-specific C# and XAML tooling.


## Step 7 — Verify the build

From the repo root:

```bash
dotnet build src/NoteBookmark.MauiApp \
/p:RuntimeIdentifier=android-arm64 \
/p:AndroidSdkDirectory=$HOME/Android/Sdk
```


## Running the emulator

```bash
$ANDROID_HOME/emulator/emulator -avd maui_dev
```

KVM hardware acceleration is enabled automatically when `/dev/kvm` is available, which makes the emulator fast and responsive.


## Troubleshooting

**`JAVA_HOME` is set to an invalid directory**
Make sure the path ends in `amd64` (not `amd6`). Check with:
```bash
ls /usr/lib/jvm/
```
Use the exact folder name shown.

**`sdkmanager: command not found`**
Run `source ~/.zshrc` to reload your PATH, or open a new terminal.

**`avdmanager: Package path is not valid. Valid system image paths are: null`**
The system image wasn't downloaded. Re-run:
```bash
sdkmanager "emulator" "system-images;android-35;google_apis;x86_64"
```

**`NETSDK1082` error during build**
This is a known issue with MAUI + Android on Linux. The `.csproj` in `NoteBookmark.MauiApp` already includes a workaround — ensure you're on the correct branch.
Loading
Loading