Index: ChapterX.Application/Auth/LoginHandler.cs
===================================================================
--- ChapterX.Application/Auth/LoginHandler.cs	(revision a8f4a2de5e875427a864aef1aa2ca9b7905549cc)
+++ ChapterX.Application/Auth/LoginHandler.cs	(revision 3ae4bab8dcf6c40690ba2765146e7e1f70fa3a2f)
@@ -18,8 +18,8 @@
         {
             var user = await _userRepository.GetByEmailAsync(request.Email, cancellationToken)
-                ?? throw new UnauthorizedAccessException("Invalid email or password.");
+                ?? throw new UnauthorizedAccessException("No account found with this email. Please register first.");
 
             if (!BCrypt.Net.BCrypt.Verify(request.Password, user.Password))
-                throw new UnauthorizedAccessException("Invalid email or password.");
+                throw new UnauthorizedAccessException("Incorrect password. Please try again.");
 
             var token = _jwtTokenService.GenerateToken(user);
Index: chapterx-frontend/src/pages/auth/LoginPage.tsx
===================================================================
--- chapterx-frontend/src/pages/auth/LoginPage.tsx	(revision a8f4a2de5e875427a864aef1aa2ca9b7905549cc)
+++ chapterx-frontend/src/pages/auth/LoginPage.tsx	(revision 3ae4bab8dcf6c40690ba2765146e7e1f70fa3a2f)
@@ -16,8 +16,9 @@
   const [loading, setLoading] = useState(false)
   const [errors, setErrors] = useState<{ email?: string; password?: string }>({})
+  const [noAccount, setNoAccount] = useState(false)
 
   const validate = () => {
     const e: typeof errors = {}
-    if (!email.trim()) e.email = 'Email or username is required'
+    if (!email.trim()) e.email = 'Email is required'
     if (!password.trim()) e.password = 'Password is required'
     setErrors(e)
@@ -28,4 +29,5 @@
     ev.preventDefault()
     if (!validate()) return
+    setNoAccount(false)
     setLoading(true)
     try {
@@ -34,5 +36,12 @@
       navigate('/')
     } catch (err: any) {
-      addToast(err.message || 'Login failed', 'error')
+      const message = err?.message || 'Incorrect email or password. Please try again.'
+      if (/no account found/i.test(message)) {
+        setNoAccount(true)
+        setErrors(p => ({ ...p, email: message }))
+      } else {
+        setErrors(p => ({ ...p, password: message }))
+      }
+      addToast(message, 'error')
     } finally {
       setLoading(false)
@@ -55,9 +64,9 @@
         <form onSubmit={handleSubmit} className="space-y-4">
           <div>
-            <label className="block text-sm text-slate-400 mb-1.5">Email or Username</label>
+            <label className="block text-sm text-slate-400 mb-1.5">Login with Email</label>
             <input
               type="text"
               value={email}
-              onChange={e => { setEmail(e.target.value); setErrors(p => ({ ...p, email: '' })) }}
+              onChange={e => { setEmail(e.target.value); setErrors(p => ({ ...p, email: '' })); setNoAccount(false) }}
               placeholder="you@example.com"
               className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 transition-colors ${
@@ -95,7 +104,7 @@
         </form>
 
-        <p className="text-center text-slate-500 text-sm mt-6">
+        <p className={`text-center text-sm mt-6 ${noAccount ? 'text-rose-400' : 'text-slate-500'}`}>
           Don't have an account?{' '}
-          <Link to="/register" className="text-indigo-400 hover:text-indigo-300">
+          <Link to="/register" className="text-indigo-400 hover:text-indigo-300 font-medium">
             Create one
           </Link>
Index: chapterx-frontend/src/store/authStore.ts
===================================================================
--- chapterx-frontend/src/store/authStore.ts	(revision a8f4a2de5e875427a864aef1aa2ca9b7905549cc)
+++ chapterx-frontend/src/store/authStore.ts	(revision 3ae4bab8dcf6c40690ba2765146e7e1f70fa3a2f)
@@ -55,6 +55,6 @@
           // If the backend responded with an error (4xx/5xx), surface it to the user
           if (err?.response) {
-            const message = err.response.data?.message || err.response.data || 'Invalid email or password.'
-            throw new Error(typeof message === 'string' ? message : 'Invalid email or password.')
+            const message = err.response.data?.message || err.response.data || 'Incorrect email or password. Please try again.'
+            throw new Error(typeof message === 'string' ? message : 'Incorrect email or password. Please try again.')
           }
           // Network error / timeout — fall through to mock login
@@ -65,5 +65,5 @@
           u => u.username === emailOrUsername || u.email === emailOrUsername
         )
-        if (!user) throw new Error('User not found. Try using a quick-login option.')
+        if (!user) throw new Error('No account found with this email. Please register first.')
         set({ currentUser: user, token: null })
       },
