Pezshkyar is an intelligent cross-platform medical assistant app built with Flutter. It offers a smooth, responsive, and delightful experience across Android & iOS, empowering users with quick access to trusted medical information and an elegant, user-friendly interface.
- β‘ Provide fast & reliable medical guidance (general, not a replacement for a doctor)
- π¨ Deliver a clean, modern, and minimal UI with RTL support (Persian/Farsi)
- β¨ Enhance UX with professional animations & micro-interactions
- π± Support cross-platform experience (Android & iOS) with local storage for chat history
π½οΈ Add a demo GIF/video to showcase the app in action:
./assets/demo/demo.gif
- π§ AI-powered medical Q&A assistant
- π¬ Interactive chat interface with message history
- π Light & Dark mode toggle
- π Push notifications
- π Quick replies for common medical FAQs
- πΎ Secure local storage for chat history
- π Share & copy information easily
- π Multilingual support (RTL ready)
- ποΈ Subtle animations for smooth transitions
Boost UX with modern motion design:
- Lottie animations (splash, empty states, success/error)
- Hero animations (screen-to-screen transitions)
- AnimatedList & AnimatedSwitcher (real-time message updates)
- Shimmer effect (loading placeholders)
- Implicit animations (
AnimatedOpacity,AnimatedContainer) - Custom transitions with
PageRouteBuilder
dependencies:
lottie: ^2.2.0import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> with SingleTickerProviderStateMixin {
late AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this);
Future.delayed(Duration(milliseconds: 1800), () {
Navigator.of(context).pushReplacementNamed('/chat');
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
body: Center(
child: Lottie.asset(
'assets/animations/medical_splash.json',
controller: _controller,
onLoaded: (composition) {
_controller
..duration = composition.duration
..forward();
},
width: 240,
height: 240,
),
),
);
}
}lib/
βββ config/
β βββ app_routes.dart
β βββ constants.dart
β βββ theme.dart
βββ models/
β βββ message_model.dart
βββ screens/
β βββ chat_screen.dart
β βββ settings_screen.dart
β βββ splash_screen.dart
βββ services/
β βββ api_service.dart
β βββ notification_service.dart
β βββ storage_service.dart
βββ widgets/
β βββ chat_bubble.dart
β βββ custom_drawer.dart
β βββ glass_input_box.dart
β βββ typing_indicator.dart
βββ main.dart
assets/
βββ animations/
β βββ medical_splash.json
βββ images/
β βββ logo.png
βββ demo/
βββ demo.gif
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
http: ^0.13.5
provider: ^6.0.5
shared_preferences: ^2.0.15
lottie: ^2.2.0
flutter_local_notifications: ^12.0.3
intl: ^0.18.0
flutter_svg: ^1.1.6
dev_dependencies:
flutter_test:
sdk: flutter
flutter_launcher_icons: ^0.9.2
flutter_native_splash: ^2.2.10Make sure you have Flutter SDK installed.
- Clone repository
git clone https://github.com/tsshack/pezshkyar-app.git
cd pezshkyar- Install dependencies
flutter pub get- Run the app
flutter runflutter build apk --releaseflutter build ipa(Requires Xcode & Apple Developer Account)
- Store API keys & tokens in .env files or secure storage.
- Never commit sensitive credentials to GitHub.
class ApiConfig {
static const String BASE_URL = 'https://api.pezshkyar.com';
// Use secure storage / remote config for tokens
}import 'package:flutter/material.dart';
class ChatBubble extends StatelessWidget {
final String text;
final bool isMe;
const ChatBubble({required this.text, this.isMe = false});
@override
Widget build(BuildContext context) {
final radius = Radius.circular(16);
return Align(
alignment: isMe ? Alignment.centerRight : Alignment.centerLeft,
child: TweenAnimationBuilder<double>(
tween: Tween(begin: 0.8, end: 1.0),
duration: Duration(milliseconds: 350),
builder: (context, value, child) {
return Transform.scale(scale: value, child: child);
},
child: Container(
margin: EdgeInsets.symmetric(vertical: 6, horizontal: 12),
padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16),
decoration: BoxDecoration(
color: isMe ? Theme.of(context).primaryColor : Colors.white,
borderRadius: BorderRadius.only(
topLeft: radius,
topRight: radius,
bottomLeft: isMe ? radius : Radius.circular(4),
bottomRight: isMe ? Radius.circular(4) : radius,
),
boxShadow: [
BoxShadow(
blurRadius: 6,
color: Colors.black12,
offset: Offset(0, 2),
),
],
),
child: Text(
text,
style: TextStyle(color: isMe ? Colors.white : Colors.black87),
textDirection: TextDirection.rtl,
),
),
),
);
}
}flutter_native_splashβ native splash screenflutter_launcher_iconsβ app iconscached_network_imageβ optimized image loadingriverpodorproviderβ state managementshimmerβ skeleton loaders
- β Unit & widget tests (chat logic, local storage)
- β API & network tests using mocks (e.g., Mockito)
- β Integration tests for real device behavior
- Fork this repository
- Create a feature branch:
git checkout -b feature/AmazingFeature - Commit changes:
git commit -m "Add AmazingFeature" - Push branch:
git push origin feature/AmazingFeature - Open a Pull Request
Please open an issue first to discuss your proposal.
Licensed under the MIT License β see the LICENSE file.
Ehsan Fazli
π Full-Stack & Mobile Developer | Flutter Enthusiast | API Designer
- π§ Email: ehsanehsanfazlinejad.com
- π Website: ehsanjs.ir
- π¬ Telegram: @Devehsan
- π GitHub: tsshack
- π LinkedIn: linkedin.com/in/ehsanfazli
Pezshkyar provides general medical information only. It is NOT a substitute for professional medical advice, diagnosis, or treatment. Always consult a qualified physician.
- Add screenshots & demo GIF
- Configure splash screen & icons
- Test on multiple devices & screen sizes
- Verify permissions & app store policies
- Remove sensitive
