https://github.com/codebydusk/no-thanks
https://github.com/codebydusk/no-thanks
Last synced: about 1 month ago
JSON representation
- Host: GitHub
- URL: https://github.com/codebydusk/no-thanks
- Owner: codebydusk
- License: gpl-3.0
- Created: 2026-05-24T11:12:24.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-05-24T12:59:08.000Z (about 1 month ago)
- Last Synced: 2026-05-24T13:15:52.760Z (about 1 month ago)
- Language: Kotlin
- Size: 108 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README

# No, thanks!
*The excuse widget you never knew you needed.*
A minimal Android home screen widget that serves you random excuses to gracefully say "no" — powered by the [No as a Service](https://github.com/hotheadhacker/no-as-a-service) API.
## Download
[](https://github.com/codebydusk/no-thanks/releases/latest)
[](https://github.com/codebydusk/no-thanks/releases)
**[⬇ Download latest APK](https://github.com/codebydusk/no-thanks/releases/latest)** · [View all releases →](https://github.com/codebydusk/no-thanks/releases)
> **Note:** The APK is unsigned (debug-signed by the CI runner). Android may show an "unknown source" prompt on first install — this is expected. Enable *Install from unknown sources* for your browser or file manager.
### Release History
| Version | Date | Notes |
| --- | --- | --- |
| [v1.0.0](https://github.com/codebydusk/no-thanks/releases/tag/v1.0) | — | Initial release |
> Older releases are always available on the [GitHub Releases page](https://github.com/codebydusk/no-thanks/releases).
## Features
### Widget
- **Switchable 4×2 / 4×1 layout** — resizes automatically based on the space you give it
- **"No, thanks!" prefix** automatically prepended to every excuse
- **Scrollable text** in 4×2 mode for longer excuses; up to 3 lines in 4×1 mode
- **Refresh button** (↻) to fetch a new excuse from the API
- **Previous button** (←) to browse through your last 10 excuses (toggle-able in settings)
- **Tap to copy** or **dedicated copy button** — configurable in settings
- **Hilarious copy confirmation** shown for 2 seconds after copying (randomly chosen from 10 messages)
- **Theme-matched loading messages** — funny quips while the API is being called, no boring spinner
- **Sarcastic fallback messages** when the API is unreachable
### Settings App
- **Appearance** — System default / Light / Dark
- **Widget Theme** — 5 themes: Blueprint, Material, Nothing OS, Samsung One UI, OnePlus
- **Corner Style** — Pill / Rounded / Sharp
- **Copy Mechanism** — Tap text to copy, or show a dedicated copy button
- **Navigation** — Toggle the previous (←) button on/off
## Widget Themes
| Theme | Style | Light Mode | Dark Mode |
| --- | --- | --- | --- |
| **Blueprint** *(default)* | Digital Blue palette | Light blue (`#E5F0FF`) bg · navy (`#002966`) text · blue (`#0052CC`) accent | Near-black (`#000E24`) bg · sky-blue (`#CCE0FF`) text · vivid blue (`#3385FF`) accent |
| **Material** | MD3 standard | Light surface (`#FFFBFE`) · dark text | Dark surface (`#1C1B1F`) · light text |
| **Nothing OS** | Dot-matrix monospace | White bg · black text · **red** (`#D71921`) refresh icon | Black bg · white text · **red** refresh icon |
| **Samsung One UI** | Rounded sans-serif | Warm light (`#F7F7F7`) bg · dark text · Samsung blue accent | Warm dark (`#1A1A1A`) bg · light text · blue accent |
| **OnePlus (OxygenOS)** | Clean minimal | Near-white (`#FAFAFA`) bg · dark text · **red** (`#F6000D`) refresh icon | Near-black (`#0F0F0F`) bg · light text · **red** refresh icon |
> Each theme automatically adapts to your device's system dark/light preference unless you override it in settings.
## Corner Styles
| Style | Corner Radius | Description |
| --- | --- | --- |
| **Pill** | 50 dp | Fully rounded, pill/capsule shape |
| **Rounded** | 8 dp | Gentle, Samsung-style corner rounding |
| **Sharp** | 0 dp | True square with zero rounding |
## Appearance Modes
| Mode | Behaviour |
| --- | --- |
| **System** | Follows the device's light/dark setting automatically |
| **Light** | Always uses the light variant of the selected theme |
| **Dark** | Always uses the dark variant of the selected theme |
## Copy Mechanism
| Option | Behaviour |
| --- | --- |
| **Tap text** | Tap anywhere on the excuse text to copy it to the clipboard |
| **Copy button** | Shows a dedicated copy icon (📋) next to the refresh button |
> The "No, thanks!" prefix is **not** copied — only the raw excuse text goes to the clipboard.
## Copy Confirmations
After copying, one of these messages is shown at random for 2 seconds:
| | |
| --- | --- |
| That's a copy, Houston. 📋 | Snagged! Use it wisely. |
| Ctrl+C executed. Godspeed. | In your clipboard. No refunds. |
| Excuse extracted with prejudice. | Pasted into your soul. 🌀 |
| That excuse is now legally yours. | Copy secured. Mission complete. |
| Yours now. Don't abuse it. | Clipboard hijacked. You're welcome. |
## Screenshots
*Coming soon*
## Tech Stack
| Component | Technology |
| --- | --- |
| Language | Kotlin 2.2 |
| UI Framework | Jetpack Compose + Material 3 |
| Widget Framework | Jetpack Glance 1.1.1 |
| Networking | Retrofit 2.11 + Gson |
| Persistence | DataStore Preferences |
| Build System | Gradle (AGP 9.2.1) |
| Min SDK | 26 (Android 8.0) |
| Target SDK | 36 |
## Project Structure
```text
app/src/main/java/com/github/codebydusk/nothanks/
├── MainActivity.kt # Settings screen (Jetpack Compose)
├── data/
│ ├── ExcuseApi.kt # Retrofit API interface
│ └── ExcuseRepository.kt # Data layer — API calls, history, settings, message banks
├── widget/
│ ├── NoThanksWidget.kt # Glance widget UI & theming
│ ├── NoThanksWidgetReceiver.kt # GlanceAppWidgetReceiver
│ └── WidgetActions.kt # ActionCallbacks — refresh, history, copy
└── ui/theme/
├── Color.kt
├── Theme.kt
└── Type.kt
```
## API
Uses [No as a Service](https://naas.isalman.dev/) — a free API that returns random excuses.
```text
GET https://naas.isalman.dev/no
```
Response:
```json
{
"reason": "I signed up for a 'Just Say No' workshop and I'm committed to practicing."
}
```
## Building & Running
### Prerequisites
- Android Studio (latest stable)
- JDK 11+
- An Android device or emulator (API 26+)
### Build debug APK
```bash
./gradlew assembleDebug
```
Output: `app/build/outputs/apk/debug/app-debug.apk`
### Install directly on a connected device
```bash
./gradlew installDebug
```
### Adding the Widget
1. Open the **No, thanks!** app once to initialize settings
2. Long-press on your home screen → **Widgets**
3. Find **No, thanks!** and drag it to your home screen
4. Resize to **4×1** (compact, up to 3 lines) or **4×2** (expanded, scrollable)
5. Open the app to change theme, corner style, appearance, and copy behaviour
## Credits
- **[No as a Service](https://github.com/hotheadhacker/no-as-a-service)** by [@hotheadhacker](https://github.com/hotheadhacker) — for the brilliant idea and the API that powers this widget
- Built with [Jetpack Glance](https://developer.android.com/jetpack/compose/glance) and [Jetpack Compose](https://developer.android.com/jetpack/compose)
## License
This project is open source and available under the [MIT License](LICENSE).