Files
nextcloud-share/.plans/CreateGiteaIssues.md

1193 lines
32 KiB
Markdown

# Gitea Issues Creation Plan
**Created**: 2026-01-26
**Status**: Ready for Implementation
**Repository**: https://git.tomusan.com (nextcloud-share)
---
## Overview
This plan details all Gitea issues to be created for the Nextcloud Share project. Issues are organized into milestones/epics and include full descriptions, acceptance criteria, and labels.
---
## Milestones
### Milestone 1: Project Infrastructure
- **Goal**: Complete foundational setup (build system, config, CI/CD)
- **Issues**: #4, #5, #6, #7
- **Target**: Sprint 1
### Milestone 2: Shared Library (libnextcloud)
- **Goal**: Core C++17 library with WebDAV support
- **Issues**: #8, #9, #10, #11, #12, #13
- **Target**: Sprint 2-3
### Milestone 3: Nintendo 3DS App
- **Goal**: Functional 3DS homebrew application
- **Issues**: #14, #15, #16, #17, #18, #19
- **Target**: Sprint 4-5
### Milestone 4: Documentation & Polish
- **Goal**: Complete user and developer documentation
- **Issues**: #20, #21
- **Target**: Sprint 6
---
## Epic Issues
### Issue #1: Project Infrastructure Setup
**Type**: Epic
**Labels**: `epic`, `infrastructure`
**Milestone**: Milestone 1
**Description**:
Set up foundational project infrastructure including repository configuration, build environments, configuration management, and CI/CD pipeline.
**Scope**:
- Git-flow workflow configuration
- Docker/Podman build containers for all platforms
- Configuration file system with secrets management
- Gitea Actions CI/CD pipeline
- Build status badges
**Related Issues**: #4, #5, #6, #7
**Acceptance Criteria**:
- [ ] Git-flow initialized with main/develop branches
- [ ] All platform build containers available and tested
- [ ] Config system working with env var overrides
- [ ] CI/CD pipeline running on every push/PR
- [ ] Build badges displayed in README
---
### Issue #2: Shared Library Development (libnextcloud)
**Type**: Epic
**Labels**: `epic`, `library`, `core`
**Milestone**: Milestone 2
**Description**:
Develop the shared C++17 library that provides Nextcloud connectivity via WebDAV. This library will be used by all platform-specific applications.
**Scope**:
- WebDAV protocol implementation
- HTTP/HTTPS client wrapper (libcurl + mbedTLS)
- Authentication (HTTP Basic Auth)
- File upload/download functionality
- Folder browsing and management
- Favorites and recent folders persistence
- Comprehensive test coverage with Google Test
**Related Issues**: #8, #9, #10, #11, #12, #13
**Acceptance Criteria**:
- [ ] Public API defined and documented
- [ ] WebDAV client functional with test Nextcloud servers
- [ ] All core features implemented
- [ ] Test coverage >80%
- [ ] CMake build system complete
- [ ] API documentation generated
---
### Issue #3: Nintendo 3DS Homebrew App
**Type**: Epic
**Labels**: `epic`, `platform:3ds`
**Milestone**: Milestone 3
**Description**:
Develop the Nintendo 3DS homebrew application that uses libnextcloud to upload screenshots and other files to Nextcloud.
**Scope**:
- 3DS-specific UI implementation
- SD card file browser
- Integration with libnextcloud
- CIA and 3DSX packaging
- Settings persistence on 3DS
**Related Issues**: #14, #15, #16, #17, #18, #19
**Acceptance Criteria**:
- [ ] Functional 3DS app with UI
- [ ] File browsing and selection working
- [ ] Successful uploads to Nextcloud
- [ ] Both CIA and 3DSX formats available
- [ ] Settings saved between sessions
---
## Infrastructure Issues (Milestone 1)
### Issue #4: Configure git-flow workflow
**Type**: Task
**Labels**: `infrastructure`, `setup`
**Milestone**: Milestone 1
**Priority**: High
**Status**: ✅ COMPLETE
**Description**:
Initialize and document the git-flow workflow for the project. This includes setting up the main and develop branches, and documenting the branching strategy for features, releases, and hotfixes.
**Tasks**:
- [x] Create develop branch from main
- [x] Push both branches to remote
- [x] Document branching strategy in CONTRIBUTING.md
- [ ] Configure branch protection rules on Gitea (if available)
**Acceptance Criteria**:
- [x] develop branch exists and is set as default
- [x] main branch represents production-ready code
- [ ] Documentation clearly explains workflow
- [ ] Team members understand branching strategy
**Branch Strategy**:
- `main` - Production-ready releases only
- `develop` - Integration branch for features
- `feature/*` - New features (branch from develop, merge to develop)
- `release/*` - Release preparation (branch from develop, merge to main + develop)
- `hotfix/*` - Critical fixes (branch from main, merge to main + develop)
---
### Issue #5: Create Docker build environment for devkitARM
**Type**: Task
**Labels**: `infrastructure`, `docker`, `platform:3ds`
**Milestone**: Milestone 1
**Priority**: High
**Description**:
Create a Docker/Podman container that includes devkitARM and all dependencies needed to build the Nintendo 3DS application. This ensures developers can build without installing platform toolchains locally.
**Tasks**:
- [ ] Create `docker/devkitarm.Dockerfile`
- [ ] Base image: devkitpro/devkitarm or equivalent
- [ ] Install required tools: makerom, tex3ds, bannertool
- [ ] Add libctru, citro3d, citro2d libraries
- [ ] Add build dependencies: CMake, git, curl
- [ ] Create `scripts/build-3ds.sh` wrapper script
- [ ] Test container builds project successfully
- [ ] Document usage in `docker/README.md`
- [ ] Add podman commands to main README
**Dockerfile Requirements**:
```dockerfile
FROM devkitpro/devkitarm:latest
RUN apt-get update && apt-get install -y \
cmake \
git \
curl \
pkg-config
# Verify devkitARM installation
RUN arm-none-eabi-gcc --version
```
**Acceptance Criteria**:
- [ ] Container builds without errors
- [ ] Can compile 3DS app inside container
- [ ] Volume mounts work correctly for source code
- [ ] Build artifacts accessible on host
- [ ] Documentation includes podman examples
- [ ] Container tagged and versioned
**Podman Commands to Document**:
```bash
# Build container
podman build -f docker/devkitarm.Dockerfile -t nextcloud-share-3ds:latest .
# Run build
podman run --rm -v ./:/project:z nextcloud-share-3ds make -C 3ds
# Interactive shell
podman run --rm -it -v ./:/project:z nextcloud-share-3ds bash
```
---
### Issue #6: Set up configuration file system
**Type**: Task
**Labels**: `infrastructure`, `configuration`
**Milestone**: Milestone 1
**Priority**: High
**Description**:
Create the configuration file system for managing test credentials and build options. Implement environment variable overrides for CI/CD and create helper scripts to load configuration.
**Tasks**:
- [ ] Create `config.example.json` with template
- [ ] Add `config.json` to .gitignore
- [ ] Create `scripts/load-config.sh` to parse JSON and export env vars
- [ ] Document environment variable overrides in README
- [ ] Add validation for required config fields
- [ ] Create `scripts/validate-config.sh`
- [ ] Update README with configuration instructions
**config.example.json Structure**:
```json
{
"nextcloud": {
"url": "https://cloud.example.com",
"username": "your-username",
"password": "your-password"
},
"settings": {
"maxRecentFolders": 5,
"uploadChunkSize": 10485760
}
}
```
**scripts/load-config.sh Logic**:
```bash
#!/bin/bash
# Load config from JSON, allowing env var overrides
CONFIG_FILE="${CONFIG_FILE:-config.json}"
if [ ! -f "$CONFIG_FILE" ]; then
echo "Warning: $CONFIG_FILE not found, using environment variables only"
fi
# Load from config.json if not set in environment
export NEXTCLOUD_URL="${NEXTCLOUD_URL:-$(jq -r '.nextcloud.url' "$CONFIG_FILE" 2>/dev/null)}"
export NEXTCLOUD_USER="${NEXTCLOUD_USER:-$(jq -r '.nextcloud.username' "$CONFIG_FILE" 2>/dev/null)}"
export NEXTCLOUD_PASSWORD="${NEXTCLOUD_PASSWORD:-$(jq -r '.nextcloud.password' "$CONFIG_FILE" 2>/dev/null)}"
# Validate required vars
if [ -z "$NEXTCLOUD_URL" ]; then
echo "Error: NEXTCLOUD_URL not set"
exit 1
fi
```
**Environment Variables**:
- `NEXTCLOUD_URL` - Override Nextcloud server URL
- `NEXTCLOUD_USER` - Override username
- `NEXTCLOUD_PASSWORD` - Override password
- `CONFIG_FILE` - Path to config file (default: config.json)
**Acceptance Criteria**:
- [ ] config.example.json created and documented
- [ ] load-config.sh correctly parses JSON
- [ ] Environment variables take precedence over JSON
- [ ] Validation script catches missing required fields
- [ ] Documentation clear for new developers
- [ ] CI can inject credentials via env vars
---
### Issue #7: Implement Gitea CI/CD pipeline
**Type**: Task
**Labels**: `infrastructure`, `ci-cd`, `gitea`
**Milestone**: Milestone 1
**Priority**: Medium
**Description**:
Set up Gitea Actions (or webhooks) to automatically build, test, and report status on every push and pull request. Include build status badges in README.
**Tasks**:
- [ ] Create `.gitea/workflows/build.yml`
- [ ] Configure workflow triggers (push, pull_request)
- [ ] Build shared library in container
- [ ] Run Google Test suite
- [ ] Build 3DS app (when available)
- [ ] Generate build artifacts
- [ ] Add build status badge to README
- [ ] Configure secret variables for test credentials
- [ ] Test with actual PR
**Workflow Structure**:
```yaml
name: Build and Test
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ develop ]
jobs:
test-library:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build shared library
run: |
podman build -f docker/builder.Dockerfile -t builder .
podman run --rm -v ./:/project:z builder cmake -B build -S shared
podman run --rm -v ./:/project:z builder cmake --build build
- name: Run tests
run: |
podman run --rm -v ./:/project:z builder ctest --test-dir build
env:
NEXTCLOUD_URL: ${{ secrets.NEXTCLOUD_TEST_URL }}
NEXTCLOUD_USER: ${{ secrets.NEXTCLOUD_TEST_USER }}
NEXTCLOUD_PASSWORD: ${{ secrets.NEXTCLOUD_TEST_PASSWORD }}
build-3ds:
runs-on: ubuntu-latest
needs: test-library
steps:
- uses: actions/checkout@v3
- name: Build 3DS app
run: |
podman build -f docker/devkitarm.Dockerfile -t 3ds-builder .
podman run --rm -v ./:/project:z 3ds-builder make -C 3ds
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: 3ds-builds
path: |
3ds/build/*.cia
3ds/build/*.3dsx
```
**Gitea Secrets to Configure**:
- `NEXTCLOUD_TEST_URL`
- `NEXTCLOUD_TEST_USER`
- `NEXTCLOUD_TEST_PASSWORD`
**Acceptance Criteria**:
- [ ] Workflow runs on every push to main/develop
- [ ] Workflow runs on every PR to develop
- [ ] Build failures are reported in PR
- [ ] Test results visible in workflow log
- [ ] Build artifacts downloadable
- [ ] Status badge shows current build status
- [ ] Secrets properly configured and working
---
## Shared Library Issues (Milestone 2)
### Issue #8: Design and implement WebDAV client
**Type**: Feature
**Labels**: `library`, `core`, `networking`
**Milestone**: Milestone 2
**Priority**: High
**Description**:
Implement a C++17 WebDAV client for communicating with Nextcloud servers. This is the core networking component that handles HTTP/HTTPS requests using libcurl with mbedTLS.
**Tasks**:
- [ ] Create `shared/include/nextcloud/webdav_client.hpp`
- [ ] Implement HTTP wrapper around libcurl
- [ ] Add SSL/TLS support with mbedTLS
- [ ] Implement WebDAV methods:
- [ ] PROPFIND (list folders/files)
- [ ] PUT (upload files)
- [ ] MKCOL (create folders)
- [ ] DELETE (delete files/folders)
- [ ] MOVE (rename/move files)
- [ ] Parse WebDAV XML responses using tinyxml2
- [ ] Implement proper error handling
- [ ] Add timeout and retry logic
- [ ] Write unit tests with mocked HTTP responses
- [ ] Document API in Doxygen format
**API Design**:
```cpp
namespace nextcloud {
class WebDAVClient {
public:
WebDAVClient(const std::string& base_url);
// Authentication
void setBasicAuth(const std::string& username, const std::string& password);
// Operations
bool uploadFile(const std::string& local_path, const std::string& remote_path,
ProgressCallback callback = nullptr);
std::vector<FileInfo> listFolder(const std::string& remote_path);
bool createFolder(const std::string& remote_path);
bool deleteItem(const std::string& remote_path);
bool moveItem(const std::string& from, const std::string& to);
// Connection testing
bool testConnection();
private:
std::string base_url_;
std::unique_ptr<HttpClient> http_client_;
};
} // namespace nextcloud
```
**Dependencies**:
- libcurl 7.68+
- mbedTLS 2.16+
- tinyxml2 9.0+
**Acceptance Criteria**:
- [ ] All WebDAV methods implemented
- [ ] SSL/TLS connections working
- [ ] XML responses correctly parsed
- [ ] Error handling comprehensive
- [ ] Unit tests with >80% coverage
- [ ] API documented
- [ ] Works with test Nextcloud servers
---
### Issue #9: Implement authentication system
**Type**: Feature
**Labels**: `library`, `core`, `security`
**Milestone**: Milestone 2
**Priority**: High
**Description**:
Implement HTTP Basic Authentication for Nextcloud. Include credential validation, secure storage, and session management.
**Tasks**:
- [ ] Create `shared/include/nextcloud/auth.hpp`
- [ ] Implement HTTP Basic Auth encoding
- [ ] Add credential validation
- [ ] Implement connection verification
- [ ] Handle authentication errors properly
- [ ] Add support for app passwords
- [ ] Write unit tests for auth flow
- [ ] Document security considerations
**API Design**:
```cpp
namespace nextcloud {
class AuthManager {
public:
struct Credentials {
std::string username;
std::string password;
};
// Validate credentials against server
static bool validateCredentials(const std::string& server_url,
const Credentials& creds);
// Encode credentials for Basic Auth header
static std::string encodeBasicAuth(const Credentials& creds);
// Test if credentials work
static bool testAuthentication(WebDAVClient& client);
};
} // namespace nextcloud
```
**Security Considerations**:
- Always use HTTPS (reject plain HTTP)
- Support Nextcloud app-specific passwords
- Clear passwords from memory when done
- Validate server certificates
**Acceptance Criteria**:
- [ ] Basic Auth implementation complete
- [ ] Credentials validated before use
- [ ] Proper error messages for auth failures
- [ ] Works with app passwords
- [ ] Security best practices followed
- [ ] Unit tests passing
---
### Issue #10: Implement file upload functionality
**Type**: Feature
**Labels**: `library`, `core`, `feature`
**Milestone**: Milestone 2
**Priority**: High
**Description**:
Implement file upload functionality with streaming, progress tracking, and chunked uploads for large files. Support pause/resume if possible.
**Tasks**:
- [ ] Create `shared/include/nextcloud/upload_manager.hpp`
- [ ] Implement streaming file uploads
- [ ] Add chunked upload support for large files
- [ ] Implement progress callback system
- [ ] Handle upload errors and retries
- [ ] Add bandwidth throttling (optional)
- [ ] Calculate and verify checksums (optional)
- [ ] Write unit tests
- [ ] Write integration tests with actual uploads
**API Design**:
```cpp
namespace nextcloud {
using ProgressCallback = std::function<void(uint64_t bytes_uploaded, uint64_t total_bytes)>;
class UploadManager {
public:
struct UploadOptions {
size_t chunk_size = 10 * 1024 * 1024; // 10MB default
int max_retries = 3;
ProgressCallback progress_callback;
};
explicit UploadManager(WebDAVClient& client);
bool uploadFile(const std::string& local_path,
const std::string& remote_path,
const UploadOptions& options = {});
bool uploadData(const std::vector<uint8_t>& data,
const std::string& remote_path);
void cancelUpload();
private:
WebDAVClient& client_;
std::atomic<bool> cancel_flag_;
};
} // namespace nextcloud
```
**Acceptance Criteria**:
- [ ] Single file uploads working
- [ ] Chunked uploads for large files
- [ ] Progress callbacks functional
- [ ] Retry logic handles transient errors
- [ ] Can upload to test Nextcloud
- [ ] Unit and integration tests passing
---
### Issue #11: Implement folder management
**Type**: Feature
**Labels**: `library`, `core`, `feature`
**Milestone**: Milestone 2
**Priority**: Medium
**Description**:
Implement folder browsing, creation, and navigation on Nextcloud. Parse PROPFIND responses to get folder contents.
**Tasks**:
- [ ] Create `shared/include/nextcloud/folder_manager.hpp`
- [ ] Implement folder listing (PROPFIND)
- [ ] Parse XML responses to extract file/folder info
- [ ] Implement folder creation (MKCOL)
- [ ] Add folder deletion
- [ ] Handle nested folder creation
- [ ] Cache folder contents (optional)
- [ ] Write unit tests with mock XML responses
**API Design**:
```cpp
namespace nextcloud {
struct FileInfo {
std::string name;
std::string path;
bool is_directory;
uint64_t size;
std::time_t modified_time;
};
class FolderManager {
public:
explicit FolderManager(WebDAVClient& client);
std::vector<FileInfo> listFolder(const std::string& remote_path);
bool createFolder(const std::string& remote_path);
bool createFolderRecursive(const std::string& remote_path);
bool deleteFolder(const std::string& remote_path);
bool folderExists(const std::string& remote_path);
private:
WebDAVClient& client_;
};
} // namespace nextcloud
```
**Acceptance Criteria**:
- [ ] Can list folder contents
- [ ] Correctly parses file/folder metadata
- [ ] Can create single folders
- [ ] Can create nested folder structures
- [ ] Error handling for invalid paths
- [ ] Unit tests passing
- [ ] Works with test Nextcloud
---
### Issue #12: Implement favorites and recent folders
**Type**: Feature
**Labels**: `library`, `feature`
**Milestone**: Milestone 2
**Priority**: Low
**Description**:
Implement a persistence layer to store user's favorite folders and track recently used folders. This data should be saved to a JSON file on the device.
**Tasks**:
- [ ] Create `shared/include/nextcloud/folder_history.hpp`
- [ ] Implement favorites storage
- [ ] Implement recent folders tracking (LRU cache)
- [ ] Make max recent folders configurable
- [ ] Save/load from JSON file
- [ ] Handle file I/O errors gracefully
- [ ] Write unit tests
**API Design**:
```cpp
namespace nextcloud {
class FolderHistory {
public:
explicit FolderHistory(size_t max_recent = 5);
// Load from file
bool load(const std::string& file_path);
bool save(const std::string& file_path);
// Favorites
void addFavorite(const std::string& path);
void removeFavorite(const std::string& path);
std::vector<std::string> getFavorites() const;
bool isFavorite(const std::string& path) const;
// Recent folders (LRU)
void addRecent(const std::string& path);
std::vector<std::string> getRecent() const;
private:
size_t max_recent_;
std::vector<std::string> favorites_;
std::deque<std::string> recent_;
};
} // namespace nextcloud
```
**JSON Format**:
```json
{
"favorites": [
"/Photos",
"/Screenshots",
"/Videos"
],
"recent": [
"/Photos/2026",
"/Screenshots",
"/Documents"
]
}
```
**Acceptance Criteria**:
- [ ] Can add/remove favorites
- [ ] Recent folders LRU working
- [ ] Persists to JSON file
- [ ] Loads correctly on startup
- [ ] Max recent folders respected
- [ ] Unit tests passing
---
### Issue #13: Write unit tests for shared library
**Type**: Task
**Labels**: `library`, `testing`
**Milestone**: Milestone 2
**Priority**: High
**Description**:
Comprehensive unit test suite using Google Test for all shared library components. Include mock HTTP responses for testing without network.
**Tasks**:
- [ ] Set up Google Test framework in CMake
- [ ] Create test directory structure
- [ ] Write tests for WebDAVClient
- [ ] Write tests for AuthManager
- [ ] Write tests for UploadManager
- [ ] Write tests for FolderManager
- [ ] Write tests for FolderHistory
- [ ] Create mock HTTP server for integration tests
- [ ] Set up test fixtures
- [ ] Configure test data files
- [ ] Add tests to CI pipeline
- [ ] Generate coverage report
**Test Structure**:
```
shared/tests/
├── CMakeLists.txt
├── test_webdav_client.cpp
├── test_auth.cpp
├── test_upload.cpp
├── test_folder_manager.cpp
├── test_folder_history.cpp
├── mocks/
│ ├── mock_http_client.hpp
│ └── mock_server.cpp
└── fixtures/
└── test_responses.xml
```
**Coverage Goals**:
- WebDAVClient: >80%
- AuthManager: >90%
- UploadManager: >75%
- FolderManager: >80%
- FolderHistory: >85%
**Acceptance Criteria**:
- [ ] All components have unit tests
- [ ] Tests run in CI pipeline
- [ ] Mock HTTP server working
- [ ] Coverage meets goals
- [ ] Tests well-documented
- [ ] Fast test execution (<30 seconds)
---
## 3DS Platform Issues (Milestone 3)
### Issue #14: Initialize 3DS project structure
**Type**: Task
**Labels**: `platform:3ds`, `setup`
**Milestone**: Milestone 3
**Priority**: High
**Description**:
Set up the 3DS project structure with devkitARM build files, basic app skeleton, and integration with the shared library.
**Tasks**:
- [ ] Create `3ds/` directory structure
- [ ] Create Makefile for devkitARM
- [ ] Set up icon and banner resources
- [ ] Create basic app initialization code
- [ ] Link shared library in build
- [ ] Create app metadata (title, author, version)
- [ ] Test build in Docker container
- [ ] Document 3DS-specific build steps
**Directory Structure**:
```
3ds/
├── src/
│ ├── main.cpp
│ ├── app.cpp
│ └── app.hpp
├── resources/
│ ├── icon.png
│ ├── banner.png
│ └── audio.wav (banner audio)
├── build/
├── Makefile
└── README.md
```
**Makefile Requirements**:
- Link with libnextcloud
- Include libctru, citro2d
- Support CIA and 3DSX output
- Include network libraries
**Acceptance Criteria**:
- [ ] Project structure created
- [ ] Makefile builds successfully
- [ ] App runs on 3DS/Citra emulator
- [ ] Shared library linked correctly
- [ ] Icon and banner display
- [ ] Documentation complete
---
### Issue #15: Implement 3DS UI framework
**Type**: Feature
**Labels**: `platform:3ds`, `ui`
**Milestone**: Milestone 3
**Priority**: High
**Description**:
Implement the UI framework for the 3DS app using citro2d. Create a menu system with screens for server config, file browsing, and settings.
**Tasks**:
- [ ] Set up citro2d/citro3d rendering
- [ ] Create screen manager for navigation
- [ ] Implement main menu screen
- [ ] Create on-screen keyboard for text input
- [ ] Implement message dialogs
- [ ] Add progress bar widget
- [ ] Create loading indicator
- [ ] Handle button input
- [ ] Add touch screen support
- [ ] Implement UI themes/colors
**Screen Hierarchy**:
```
Main Menu
├── Upload Files (→ File Browser)
├── Server Settings (→ Settings Screen)
├── Favorites (→ Folder List)
└── Exit
```
**UI Components Needed**:
- Menu lists
- Text input dialogs
- Confirmation dialogs
- Progress bars
- Loading spinners
- Keyboard overlay
**Acceptance Criteria**:
- [ ] UI renders on both screens
- [ ] Touch and button input working
- [ ] Screen navigation functional
- [ ] Text input working
- [ ] Progress indicators visible
- [ ] Responsive and smooth
---
### Issue #16: Implement SD card file browser
**Type**: Feature
**Labels**: `platform:3ds`, `feature`
**Milestone**: Milestone 3
**Priority**: High
**Description**:
Implement a file browser for the 3DS SD card to allow users to select screenshots, videos, and other files for upload.
**Tasks**:
- [ ] Implement SD card access using libctru
- [ ] Create file browser UI
- [ ] Add folder navigation
- [ ] Show file details (size, date)
- [ ] Add file filtering (images, videos, all)
- [ ] Implement multi-file selection
- [ ] Add thumbnail preview for images (optional)
- [ ] Handle large directories efficiently
- [ ] Add sort options (name, date, size)
**Screenshot Locations**:
- `/Nintendo 3DS/[ID]/[ID]/title/[TID]/screenshots/`
- SD card root
**Acceptance Criteria**:
- [ ] Can browse SD card folders
- [ ] Can select files for upload
- [ ] File details displayed
- [ ] Filtering works
- [ ] Multi-select supported
- [ ] Performance acceptable
---
### Issue #17: Integrate shared library with 3DS app
**Type**: Task
**Labels**: `platform:3ds`, `integration`
**Milestone**: Milestone 3
**Priority**: High
**Description**:
Integrate libnextcloud with the 3DS app. Set up network stack, handle connections, and implement upload functionality.
**Tasks**:
- [ ] Initialize 3DS network stack (SOC)
- [ ] Link libnextcloud in Makefile
- [ ] Configure libcurl for 3DS
- [ ] Configure mbedTLS for 3DS
- [ ] Implement upload workflow
- [ ] Handle network errors gracefully
- [ ] Add connection status indicator
- [ ] Test uploads to Nextcloud
- [ ] Handle app suspend/resume
**Network Stack Initialization**:
```cpp
// Initialize SOC (Socket)
Result soc_init = socInit(SOC_BUFFER, SOC_BUFFER_SIZE);
if (R_FAILED(soc_init)) {
// Handle error
}
// At exit
socExit();
```
**Acceptance Criteria**:
- [ ] Network stack initializes
- [ ] libnextcloud functions called successfully
- [ ] Can upload files to Nextcloud
- [ ] Error messages displayed to user
- [ ] Network errors handled gracefully
- [ ] App doesn't crash on suspend/resume
---
### Issue #18: Implement 3DS settings screen
**Type**: Feature
**Labels**: `platform:3ds`, `ui`, `feature`
**Milestone**: Milestone 3
**Priority**: Medium
**Description**:
Create a settings screen where users can configure their Nextcloud server URL, username, and password. Settings should persist across app restarts.
**Tasks**:
- [ ] Create settings screen UI
- [ ] Implement server URL input
- [ ] Implement username/password input
- [ ] Add connection test button
- [ ] Save settings to SD card
- [ ] Load settings on startup
- [ ] Validate URL format
- [ ] Show connection status
- [ ] Add clear credentials option
**Settings Storage**:
- Location: `/3ds/nextcloud-share/config.json`
- Format: JSON (using nlohmann/json)
- Encrypted password storage (optional)
**Settings UI**:
```
Server Settings
├── Server URL: [https://cloud.example.com]
├── Username: [username]
├── Password: [••••••••]
├── Test Connection [Button]
└── Save [Button]
```
**Acceptance Criteria**:
- [ ] Settings screen functional
- [ ] Can input all credentials
- [ ] Connection test works
- [ ] Settings persist correctly
- [ ] URL validation working
- [ ] Clear error messages
---
### Issue #19: Create CIA and 3DSX distribution packages
**Type**: Task
**Labels**: `platform:3ds`, `distribution`
**Milestone**: Milestone 3
**Priority**: Medium
**Description**:
Set up packaging for both CIA (installable) and 3DSX (Homebrew Launcher) formats. Include proper metadata, icons, and banners.
**Tasks**:
- [ ] Configure makerom for CIA generation
- [ ] Create proper icon (48x48 and 24x24)
- [ ] Create banner image (256x128)
- [ ] Add banner audio
- [ ] Set up app metadata in Makefile
- [ ] Configure app permissions
- [ ] Test CIA installation
- [ ] Test 3DSX in Homebrew Launcher
- [ ] Automate packaging in CI
- [ ] Create release script
**App Metadata**:
- Title: "Nextcloud Share"
- Author: "Tom Hicks"
- Description: "Upload files to Nextcloud"
- Version: Managed in Makefile
**Required Tools**:
- makerom (CIA generation)
- 3dsxtool (3DSX generation)
- bannertool (banner creation)
- tex3ds (texture conversion)
**Acceptance Criteria**:
- [ ] CIA builds successfully
- [ ] 3DSX builds successfully
- [ ] CIA installs on 3DS
- [ ] 3DSX runs from Homebrew Launcher
- [ ] Icon and banner display correctly
- [ ] Automated build process working
- [ ] Both formats in CI artifacts
---
## Documentation Issues (Milestone 4)
### Issue #20: Write user documentation
**Type**: Documentation
**Labels**: `documentation`, `user-facing`
**Milestone**: Milestone 4
**Priority**: Medium
**Description**:
Create comprehensive user documentation including installation guides, configuration instructions, and usage tutorials for each platform.
**Tasks**:
- [ ] Create `docs/` directory structure
- [ ] Write installation guide for 3DS
- [ ] Write configuration guide
- [ ] Create step-by-step usage guide
- [ ] Add screenshots/photos
- [ ] Write FAQ section
- [ ] Write troubleshooting guide
- [ ] Add video tutorial (optional)
- [ ] Translate to other languages (optional)
**Documentation Structure**:
```
docs/
├── user-guide/
│ ├── installation-3ds.md
│ ├── configuration.md
│ ├── usage.md
│ └── screenshots/
├── faq.md
└── troubleshooting.md
```
**Topics to Cover**:
- How to install CIA files
- How to use Homebrew Launcher
- How to configure Nextcloud server
- How to browse and select files
- How to upload files
- How to manage favorites
- Common errors and solutions
**Acceptance Criteria**:
- [ ] Installation instructions clear
- [ ] Configuration steps documented
- [ ] Usage guide with examples
- [ ] FAQ answers common questions
- [ ] Troubleshooting covers common issues
- [ ] Screenshots included
- [ ] Tested by new users
---
### Issue #21: Write developer documentation
**Type**: Documentation
**Labels**: `documentation`, `developer`
**Milestone**: Milestone 4
**Priority**: Medium
**Description**:
Create developer documentation including architecture overview, API documentation, build instructions, and contributing guidelines.
**Tasks**:
- [ ] Write architecture overview
- [ ] Generate API docs with Doxygen
- [ ] Document build process
- [ ] Create contributing guidelines
- [ ] Write code style guide
- [ ] Document testing procedures
- [ ] Add platform porting guide
- [ ] Create release process docs
- [ ] Document CI/CD setup
**Documentation Structure**:
```
docs/
├── developer/
│ ├── architecture.md
│ ├── api/
│ │ └── (Doxygen generated)
│ ├── building.md
│ ├── testing.md
│ ├── porting.md
│ └── releasing.md
├── CONTRIBUTING.md
└── CODE_STYLE.md
```
**Topics to Cover**:
- System architecture diagram
- Library API reference
- How to build for each platform
- How to run tests
- How to add new platforms
- Code style requirements
- PR process
- Release checklist
**Acceptance Criteria**:
- [ ] Architecture clearly explained
- [ ] API fully documented
- [ ] Build instructions tested
- [ ] Contributing guide complete
- [ ] Code style defined
- [ ] Testing docs clear
- [ ] Porting guide useful
- [ ] Release process documented
---
## Issue Creation Order
**Recommended creation order**:
1. Epic issues (#1, #2, #3) - for overall tracking
2. Infrastructure issues (#4-#7) - immediate tasks
3. Library issues (#8-#13) - core development
4. Platform issues (#14-#19) - after library is stable
5. Documentation issues (#20-#21) - ongoing, final polish
---
## Labels to Create in Gitea
**Type Labels**:
- `epic` - Epic/milestone tracking issues
- `feature` - New features
- `task` - Implementation tasks
- `bug` - Bug fixes
- `documentation` - Documentation updates
**Component Labels**:
- `infrastructure` - Build, CI/CD, setup
- `library` - Shared library code
- `core` - Core functionality
- `ui` - User interface
- `networking` - Network/HTTP code
- `security` - Security-related
**Platform Labels**:
- `platform:3ds` - Nintendo 3DS specific
- `platform:wiiu` - Wii U specific
- `platform:switch` - Switch specific
- `platform:vita` - PS Vita specific
**Priority Labels**:
- `priority:high` - Must have for release
- `priority:medium` - Should have
- `priority:low` - Nice to have
**Status Labels**:
- `status:blocked` - Blocked by other issues
- `status:in-progress` - Currently being worked on
- `status:review` - In code review
---
## Next Steps
1. Create labels in Gitea
2. Create milestone definitions
3. Create epic issues (#1-#3) first
4. Create remaining issues in order
5. Link related issues together
6. Assign initial priorities
7. Begin working on infrastructure issues
---
## Notes
- All issues should reference related issues
- Include acceptance criteria in each issue
- Update issues as requirements change
- Close issues only when fully tested
- Use issue numbers in commit messages: `git commit -m "feat: implement WebDAV client (#8)"`